この記事は、Java での enum の詳細な使用法に関する関連情報を主に紹介します。この記事が、Java での enum の使用方法を理解して習得するのに役立つことを願っています。
enum は列挙の略で、JDK 1.5 で導入された新機能であり、java.lang パッケージに格納されています。
以下は、enum の使用に関する私の経験と概要の一部です。オリジナルのインターフェース定義定数
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 class クラス (java.lang.Enum は抽象クラスです)。列挙型は一般的なパターン Class Enum
package com.hmw.test; /** * 枚举测试类 * @author <a href="mailto:hemingwang0902@126.com" rel="external nofollow" rel="external nofollow" >何明旺</a> */ public enum EnumTest { MON, TUE, WED, THU, FRI, SAT, SUN; }
に準拠します。このコードは実際に Enum (String name, int ordinal) を 7 回呼び出します: enum に対する
new Enum<EnumTest>("MON",0); new Enum<EnumTest>("TUE",1); new Enum<EnumTest>("WED",2); ... ...
トラバーサル、スイッチ、その他の一般的な操作
トラバーサルおよびスイッチ操作のサンプル コード:
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 TUE WED THU FRI SAT SUN ----------------我是分隔线------------------ 今天是星期二
enum オブジェクトの一般的なメソッドの紹介
int CompareTo(E o)
この列挙と指定されたオブジェクトを比較します注文。
この列挙定数の列挙型に対応する Class オブジェクトを返します。
列挙宣言で宣言されているように、この列挙定数の名前を返します。
列挙定数の序数 (初期定数の序数が 0 である列挙宣言内の位置) を返します。
宣言に含まれる列挙定数の名前を返します。
/** * Java学习交流QQ群:589809992 我们一起学Java! */ 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 在 MON 之后 getDeclaringClass(): com.hmw.test.EnumTest name(): TUE toString(): TUE ordinal(): 1
enumのプロパティとメソッドをカスタマイズする
value属性とgetValue()メソッドをenumオブジェクトに追加します:
package com.hmw.test; /** * 枚举测试类 * * @author <a href="mailto:hemingwang0902@126.com" rel="external nofollow" rel="external nofollow" >何明旺</a> */ 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アプリケーション
/** * Java学习交流QQ群:589809992 我们一起学Java! */ 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.Enum を継承したクラスが生成されていることがわかります。 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 を継承しているため、enum は extends キーワードを使用して他のクラスを継承できないことです。 (Java は単一継承です)。
以上がJava での enum の使用の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。