enum の正式名は enumeration で、JDK 5 で導入された新機能であり、java.lang パッケージに格納されています。この記事では、Java の列挙に関する知識を紹介します。必要な方は参照してください。enum の正式名は enumeration で、JDK 5 で導入された新機能であり、java.lang パッケージに格納されています。
オリジナルのインターフェース定義定数public interface IConstants {
String MON = "Mon";
String TUE = "Tue";
String WED = "Wed";
String THU = "Thu";
String FRI = "Fri";
String SAT = "Sat";
String SUN = "Sun";
}
enum キーワードを使用して列挙型を作成します。これは、作成された型が java.lang.Enum クラス (java .lang. Enum は抽象クラスです)。列挙型は、一般的なパターン Class Enum271447d3c75ca4f8ce424bd25b75b2af> に準拠しており、E は列挙型の名前を表します。列挙型の各値は、保護された Enum(String name, int ordinal) コンストラクターにマップされます。ここで、各値の名前は文字列に変換され、序数設定は、この設定が作成された順序を表します。
package com.bjpowernode.test; /** * 枚举测试类 */ public enum EnumTest { MON, TUE, WED, THU, FRI, SAT, SUN; }
このコードは実際に Enum (String name, int ordinal) を 7 回呼び出します:
new Enum<EnumTest>("MON",0); new Enum<EnumTest>("TUE",1); new Enum<EnumTest>("WED",2); ... ...トラバーサルやスイッチなどの一般的な操作
enum のトラバースとスイッチのサンプル コード:
public class Test { public static void main(String[] args) { for (EnumTest e : EnumTest.values()) { System.out.println(e.toString()); } System.out.println("----------------我是分隔线------------------"); EnumTest test = EnumTest.TUE; switch (test) { case MON: System.out.println("今天是星期一"); break; case TUE: System.out.println("今天是星期二"); break; // ... ... default: System.out.println(test); break; } } }
出力結果 :
MON
火水
木
金
土
SUN
---------------私は仕切りです------------ ------
今日は火曜日です
列挙オブジェクトの一般的なメソッドの紹介int compareTo(E o)
この列挙と指定されたオブジェクトの順序を比較します。
Class<E> getDeclaringClass()回 この永続的な金額の列挙型に対応する CLASS オブジェクトを返します。 String name() 列挙宣言で宣言されているように、この enum 定数の名前を返します。 AINT Ordinal () 列挙された金額の順序番号を返します (これは列挙ステートメント内にあり、最初の定数順序は 0 です)。 String toString()は、宣言に含まれる列挙型定数の名前を返すことができます。 static7f8fdcecef67626c97700d7b0c20c234>
public class Test { public static void main(String[] args) { EnumTest test = EnumTest.TUE; //compareTo(E o) switch (test.compareTo(EnumTest.MON)) { case -1: System.out.println("TUE 在 MON 之前"); break; case 1: System.out.println("TUE 在 MON 之后"); break; default: System.out.println("TUE 与 MON 在同一位置"); break; } //getDeclaringClass() System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName()); //name() 和 toString() System.out.println("name(): " + test.name()); System.out.println("toString(): " + test.toString()); //ordinal(), 返回值是从 0 开始 System.out.println("ordinal(): " + test.ordinal()); } }出力結果: TUE After MON
getDeclaringClass(): com.hmw.test.EnumTest name(): TUE toString(): TUE ordinal(): 1
enumのプロパティとメソッドをカスタマイズ
enumオブジェクトにvalue属性とgetValue()メソッドを追加:package com.bjpowernode.test; /** * 枚举测试类 * */ public enum EnumTest { MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) { @Override public boolean isRest() { return true; } }, SUN(0) { @Override public boolean isRest() { return true; } }; private int value; private EnumTest(int value) { this.value = value; } public int getValue() { return value; } public boolean isRest() { return false; } } public class Test { public static void main(String[] args) { System.out.println("EnumTest.FRI 的 value = " + EnumTest.FRI.getValue()); } }出力結果:
EnumTest.FRI 的 value = 5 EnumSet,EnumMap 的应用 public class Test { public static void main(String[] args) { // EnumSet的使用 EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class); for (EnumTest day : weekSet) { System.out.println(day); } // EnumMap的使用 EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class); weekMap.put(EnumTest.MON, "星期一"); weekMap.put(EnumTest.TUE, "星期二"); // ... ... for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) { Entry<EnumTest, String> entry = iter.next(); System.out.println(entry.getKey().name() + ":" + entry.getValue()); } } }原理分析
enumの構文構造はclassの構文とは異なりますが、コンパイラによってコンパイルされた後、クラスファイルが生成されます。このクラス ファイルを逆コンパイルすると、java.lang.Enum1a4db2c2c2313771e5742b6debf617a1 を継承したクラスが実際に生成されていることがわかります。 EnumTest を逆コンパイルした後に取得される内容 (javap com.hmw.test.EnumTest コマンド) は次のとおりです:
public class com.hmw.test.EnumTest extends java.lang.Enum{ public static final com.hmw.test.EnumTest MON; public static final com.hmw.test.EnumTest TUE; public static final com.hmw.test.EnumTest WED; public static final com.hmw.test.EnumTest THU; public static final com.hmw.test.EnumTest FRI; public static final com.hmw.test.EnumTest SAT; public static final com.hmw.test.EnumTest SUN; static {}; public int getValue(); public boolean isRest(); public static com.hmw.test.EnumTest[] values(); public static com.hmw.test.EnumTest valueOf(java.lang.String); com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest); }つまり、実際には enum はクラスですが、Java コンパイラーが構文の解析とコンパイルを行ってくれます。
概要
enum は通常のクラスと考えることができますが、これらはすべていくつかのプロパティとメソッドを定義できます。 違いは、enum は java.lang .Enum を継承しているため、extends キーワードを使用して他のクラスを継承できないことです。 (Java は単一継承です)。以上がJava 列挙_Power ノードの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。