Java 列挙クラスの概要: (Java 学習ビデオの推奨事項: Java ビデオ チュートリアル)
1. 列挙クラスはどのような状況で使用されますか?
クラスのオブジェクトが限定され、固定されている場合がありますが、この場合は列挙型クラスを使用する方が便利です。
2. 静的定数を使用して列挙型クラスを置き換えてみてはいかがでしょうか?
public static final int SEASON_SPRING = 1; public static final int SEASON_SUMMER = 2; public static final int SEASON_FALL = 3; public static final int SEASON_WINTER = 4;
列挙クラスはより直感的で、タイプ セーフです。定数を使用すると、次のような問題があります:
1. タイプは安全ではありません。メソッドでシーズンのパラメーターを渡す必要がある場合、定数が使用されている場合、仮パラメーターは int 型になります。開発者は任意の型の int 値を渡すことができますが、列挙型の場合は、それのみを渡すことができます。列挙クラスに渡される、含まれるオブジェクト。
2. 名前空間はありません。開発者は名前を付けるときに SEASON_ で始める必要があります。そうすれば、他の開発者がこのコードを見たときに、これら 4 つの定数が季節を表していることがわかります。
3. 列挙型クラスの概要
まず、単純な列挙型クラスを見てみましょう。
package enumcase;public enum SeasonEnum { SPRING,SUMMER,FALL,WINTER; }
enum はクラスおよびインターフェイスと同じステータスを持ちます。enum を使用して定義された列挙型クラスは、デフォルトで Object クラスを継承するのではなく、java.lang.Enum を継承します。列挙クラスは 1 つ以上のインターフェイスを実装できます。列挙型クラスのすべてのインスタンスは、 new キーワードを使用したり、コンストラクターを明示的に呼び出したりせずに、最初の行に表示する必要があります。 public static 最終変更を自動的に追加します。 enum を使用して定義された非抽象列挙クラスは、デフォルトで Final で修飾され、継承できません。列挙型クラスのコンストラクターはプライベートのみにできます。
4. 列挙型クラスの概要
属性とメソッドは列挙型クラスでも定義できますが、それらは静的および非静的です。
package enumcase;public enum SeasonEnum { SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天"); private final String name; private SeasonEnum(String name) { this.name = name; } public String getName() { return name; } }
実際、最初の行で列挙型クラスのインスタンスを記述すると、デフォルトでコンストラクターが呼び出されるため、ここでパラメーターを渡す必要があります。パラメーターなしのコンストラクターは明示的に宣言されておらず、呼び出すことしかできないためです。パラメータを持つコンストラクタ。
このようなオブジェクトを他の場所で宣言できないように、コンストラクターをプライベートとして定義する必要があります。列挙型クラスは通常、不変クラスとして設計する必要があり、そのフィールドは変更しない方が安全であり、コードはより簡潔になります。そこで、フィールドをプライベートのfinalで変更します。
5. 列挙型クラスはインターフェイスを実装します
列挙型クラスは 1 つ以上のインターフェイスを実装できます。通常のクラスと同様に、インターフェイスを実装する場合は、インターフェイスに定義されているすべてのメソッドを実装する必要があります。完全に実装されていない場合、列挙型クラスは抽象クラスになりますが、明示的に抽象変更を追加する必要はありません。システム化により追加されます。デフォルトでそれです。
package enumcase; public enum Operation { PLUS{ @Override public double eval(double x, double y) { return x + y; } }, MINUS{ @Override public double eval(double x, double y) { return x - y; } }, TIMES{ @Override public double eval(double x, double y) { return x * y; } }, DIVIDE{ @Override public double eval(double x, double y) { return x / y; } }; /** * 抽象方法,由不同的枚举值提供不同的实现。 * @param x * @param y * @return */ public abstract double eval(double x, double y); public static void main(String[] args) { System.out.println(Operation.PLUS.eval(10, 2)); System.out.println(Operation.MINUS.eval(10, 2)); System.out.println(Operation.TIMES.eval(10, 2)); System.out.println(Operation.DIVIDE.eval(10, 2)); } }
Operioクラスは実際には抽象クラスであり列挙値を作成できないため、ここで列挙値を宣言すると抽象メソッドが実装されます これは実際には匿名内部クラスの実装であり、中括弧の部分がクラス本体です。コンパイルされたファイルを見てみましょう。
合計 5 つのクラス ファイルが生成されました。これは、PLUS、MINUS、TIMES、および DIVIDE が Operation の匿名内部クラスのインスタンスであることを証明しています。
6. switch ステートメントの式には列挙値を指定できます
Java5 では enum キーワードと拡張スイッチが追加されました。
package enumcase; public class SeasonTest { public void judge(SeasonEnum s) { switch(s) { case SPRING: System.out.println("春天适合踏青。"); break; case SUMMER: System.out.println("夏天要去游泳啦。"); break; case FALL: System.out.println("秋天一定要去旅游哦。"); break; case WINTER: System.out.println("冬天要是下雪就好啦。"); break; } } public static void main(String[] args) { SeasonEnum s = SeasonEnum.SPRING; SeasonTest test = new SeasonTest(); test.judge(s); } }
制限として列挙クラスを追加せずに、列挙値を case 式に直接書き込みます。
推奨: Java 基本チュートリアル
以上がJava 列挙クラスに関する簡単な説明 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。