列挙 - JDK1.5は、新しいタイプを紹介します。それは「小さな」機能を検討したがJavaでは、私は私の開発は、「偉大な」利便性をもたらしていました。
ビッグブラザー、私はあなたがそれを理解するために、私自身の理解を追加します。
定数:使用
JDK1.5前に、我々は定数で定義します。public static決勝..... さて、列挙定数でそれはグループの列挙型、列挙に関連して一定の方法よりも多くを提供することができます。
Javaコード
public enum Color {
RED, GREEN, BLANK, YELLOW
}
二つの使用法:スイッチ
JDK1.6のswitch文だけint型、char型、列挙型、列挙型をサポートする前に、私たちのコードを読みやすくします。
Javaコード
enum Signal {
GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
3を使用してください:列挙に新しいメソッドを追加
あなたがあなた自身の方法をカスタマイズする予定がある場合は、最終的に列挙型のインスタンスで直列化されるセミコロンを追加します。要件を定義し、Javaの列挙型のインスタンスにする必要があります。
Javaコード
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
// get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
使用法4:列挙方法をカバー
ここでは方法の例としては、()のtoStringをカバーしています。
Javaコード
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//覆盖方法
@Override
public String toString() {
return this.index+"_"+this.name;
}
}
使用法5:インターフェイスを実装
列挙クラスのすべてがjava.lang.Enumから継承します。Javaは多重継承をサポートしていないので、その列挙オブジェクトが他のクラスから継承することはできません。
Javaコード
public interface Behaviour {
void print();
String getInfo();
}
public enum Color implements Behaviour{
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//接口方法
@Override
public String getInfo() {
return this.name;
}
//接口方法
@Override
public void print() {
System.out.println(this.index+":"+this.name);
}
}
使用方法6:使用するインターフェイス組織の列挙
Javaコード
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT, CAKE, GELATO
}
}
/**
* 测试继承接口的枚举的使用(by 大师兄 or 大湿胸。)
*/
private static void testImplementsInterface() {
for (Food.DessertEnum dessertEnum : Food.DessertEnum.values()) {
System.out.print(dessertEnum + " ");
}
System.out.println();
//我这地方这么写,是因为我在自己测试的时候,把这个coffee单独到一个文件去实现那个food接口,而不是在那个接口的内部。
for (CoffeeEnum coffee : CoffeeEnum.values()) {
System.out.print(coffee + " ");
}
System.out.println();
//搞个实现接口,来组织枚举,简单讲,就是分类吧。如果大量使用枚举的话,这么干,在写代码的时候,就很方便调用啦。
//还有就是个“多态”的功能吧,
Food food = Food.DessertEnum.CAKE;
System.out.println(food);
food = CoffeeEnum.BLACK_COFFEE;
System.out.println(food);
}
業績
使用法7:セットに列挙を使用します
java.util.EnumSetとjava.util.EnumMapは2つの列挙されています。要素のコレクションを繰り返さない確保EnumSetの、EnumMap列挙型キーであるが、値の任意のタイプであってもよいです。2セットの使用についてあなたはJDKのドキュメントを参照することができ、ここでは触れません。
列挙原則と実装の詳細については、以下を参照してください。
参考:「ThinkingInJava」第4版
http://softbeta.iteye.com/blog/1185573
私の記事で、それが再生されているので、それは、基本的に変わらないことが誰かをもたらすことができるが、彼の足を踏ん。それは私の兄の文字を満たしていません。今私は整理するためのそれらの使用を理解します。
しかし、また、それはそれを学ぶために始めていたためです。通常我々は、すべての後、私達はちょうどについて少し知っているすべてを知っていると思うか、私たちが知っている、実際には、なくなってはそれが何であるかわからないと思います。
学習のうち、それを行うことができますどのようにコードを見て使用されていませんか?
ここに私自身のテストコードがあります。
package com.lxk.enumTest;
/**
* Java枚举用法测试
* <p>
* Created by lxk on 2016/12/15
*/
public class EnumTest {
public static void main(String[] args) {
forEnum();
useEnumInJava();
}
/**
* 循环枚举,输出ordinal属性;若枚举有内部属性,则也输出。(说的就是我定义的TYPE类型的枚举的typeName属性)
*/
private static void forEnum() {
for (SimpleEnum simpleEnum : SimpleEnum.values()) {
System.out.println(simpleEnum + " ordinal " + simpleEnum.ordinal());
}
System.out.println("------------------");
for (TYPE type : TYPE.values()) {
System.out.println("type = " + type + " type.name = " + type.name() + " typeName = " + type.getTypeName() + " ordinal = " + type.ordinal());
}
}
/**
* 在Java代码使用枚举
*/
private static void useEnumInJava() {
String typeName = "f5";
TYPE type = TYPE.fromTypeName(typeName);
if (TYPE.BALANCE.equals(type)) {
System.out.println("根据字符串获得的枚举类型实例跟枚举常量一致");
} else {
System.out.println("大师兄代码错误");
}
}
/**
* 季节枚举(不带参数的枚举常量)这个是最简单的枚举使用实例
* Ordinal 属性,对应的就是排列顺序,从0开始。
*/
private enum SimpleEnum {
SPRING,
SUMMER,
AUTUMN,
WINTER
}
/**
* 常用类型(带参数的枚举常量,这个只是在书上不常见,实际使用还是很多的,看懂这个,使用就不是问题啦。)
*/
private enum TYPE {
FIREWALL("firewall"),
SECRET("secretMac"),
BALANCE("f5");
private String typeName;
TYPE(String typeName) {
this.typeName = typeName;
}
/**
* 根据类型的名称,返回类型的枚举实例。
*
* @param typeName 类型名称
*/
public static TYPE fromTypeName(String typeName) {
for (TYPE type : TYPE.values()) {
if (type.getTypeName().equals(typeName)) {
return type;
}
}
return null;
}
public String getTypeName() {
return this.typeName;
}
}
}
そして、テスト結果はグラフ:
簡単な例では、我々は基本的には基本的に、私は第二の例を理解していない、使用されてきました。それは、実際には、理解することができ、パラメータ、続いて第二の例で見ることができます。
列挙キーワード、また別のクラスであり、ほとんどのクラスなどとして理解することができます。見ることができる、上記の例の性質があり、この方法は、構造を有し、そこにゲッター、セッターをも有していてもよいが、一般的にパラメータを渡すように構成されています。他のカスタム方法があります。コンマで区切って、これらの事の前に、最後にセミコロンで終わるので、この部分は、この列挙のインスタンスと呼ばれています。また、オブジェクトのうちのクラスの新しいインスタンス、として理解することができます。理解するのに十分なこの時間。のみ、クラス、新しいオブジェクトが、あなたはすべての新しい、いくつかは、いくつかをしたいだろうし、この列挙キーワード、彼は、彼が唯一の列挙に反映させることができるオブジェクトのインスタンスのではないでしょう所有することができます。言い換えれば、彼の対応の例は限定されています。これは利点の列挙で、特定の物事の範囲を制限し、所与の栗:年間を通して、唯一四季があることができ、あなたの文字列表現ならば、それは使用することに、しかし、海に行ってきました列挙型、そしてあなたは、プロパティ今シーズンは、対応する値は、かっこ内の列挙にリストされている、すべてが来て、すべてのオプションを持って、あなただけの内部に選ぶことができます。あなたは他を持つことができません。
私の例では、上記の型名に基づいており、あなたが列挙インスタンスにそれらの内部のみ1型TYPEの--TYPE.BALANCEの例から選ぶことができます。注方法
TYPEタイプ= TYPE.fromTypeName(型名);
戻り値の型は、この方法TYPEの列挙型です。
理解するように、この時間は、このバーではどのように列挙作品です
その後、追加します。
実際には3つの特性であるパラメータと上記列挙型の例としては、型名私のカスタムに加えて、2つのシステムが来るがあります。下の図のソースを参照してください。
これを見た後、私はあなたが以下の画像内の命令の言葉を理解できるかどうかわからない:以下の写真は列挙、規範や基準の主な用途を示しています。希望は、実際の開発時に使用することができます
最後に、これを追加します。
たぶん、あなたはそれについて知っているが、多分あなたはそれについて何も知らないのですか?私は本当に唯一のテストの後、知りません!!!
列挙型オブジェクトの値との比較は、==必要はなく、同等の方法ヨーヨーを等しく使用するかどうか、値を比較するために直接使用されます。
具体的には、以下のリンクを参照してください。
Javaの列挙型クラスの比較がある==または等しいですか?
2017年11月7日更新
いくつかの古い鉄は、このスイッチケースを作成する方法を、私は長いったらしい以下を見ていきます。
private static void testSwitchCase() {
String typeName = "f5";
//这几行注释呢,你可以试着三选一,测试一下效果。
//String typeName = "firewall";
//String typeName = "secretMac";
TypeEnum typeEnum = TypeEnum.fromTypeName(typeName);
if (typeEnum == null) {
return;
}
switch (typeEnum) {
case FIREWALL:
System.out.println("枚举名称(即默认自带的属性 name 的值)是:" + typeEnum.name());
System.out.println("排序值(默认自带的属性 ordinal 的值)是:" + typeEnum.ordinal());
System.out.println("枚举的自定义属性 typeName 的值是:" + typeEnum.getTypeName());
break;
case SECRET:
System.out.println("枚举名称(即默认自带的属性 name 的值)是:" + typeEnum.name());
System.out.println("排序值(默认自带的属性 ordinal 的值)是:" + typeEnum.ordinal());
System.out.println("枚举的自定义属性 typeName 的值是:" + typeEnum.getTypeName());
break;
case BALANCE:
System.out.println("枚举名称(即默认自带的属性 name 的值)是:" + typeEnum.name());
System.out.println("排序值(默认自带的属性 ordinal 的值)是:" + typeEnum.ordinal());
System.out.println("枚举的自定义属性 typeName 的值是:" + typeEnum.getTypeName());
break;
default:
System.out.println("default");
}
}
その後、結果のショット実行されます。
この列挙を読んだ後、あなたが概念を理解する必要があり、古い鉄、で、この列挙、彼はあなたがStudentクラスは、Personクラスなので、クラスのいくつかを定義するのと同様に、ターゲットです。
このような概念を持っています。長いクラスとして、彼は属性を持つことができ、コンストラクタを持つことができるため、方法があります。
次に、あなたが見る、この場所は1が序である、2つのデフォルトの属性、1名を持ち、名前や年齢などのこれら二つの属性を使用して、学生のクラスを定義して、Personクラスとして、
しかし、この2つのプロパティが付属して、あなたはそれを定義する必要はありませんシステムです。
あなたはまた、あなた自身の声明を列挙することである列挙クラスを与える昇給プロパティに求めることができます。
私は、それの単純なカスタム属性の型名を追加するために、TypeEnumが列挙、とても乾燥していることを内部に上記のコード例を持っています
彼は自分の名前を持っていますが、その後、暫定的にそのエイリアスと呼ばれるこのカスタム属性私を呼ん。
私は私のカスタムに、このプロパティの初期値を書き込むための施工方法であるその例だということを見ることができます。
また、この工法ではなく、また国民を実行している、あなたが試すことができます信じていません。
また、あなたはシステムの名前が付いています属性をすることができない、コンストラクタ関数の割り当てでは、何の理由はありません。