【Java】列挙型


1. 列挙型

1.1 列挙型とは

列挙型は、名前付き定数の固定セットを定義するために使用される特別なデータ型です。列挙型は、関連する定数のセットを表すための、より強力で、より安全で、より読みやすい方法を提供します。

Java では、列挙型はenumキーワードを使用して定義されます。列挙型には 1 つ以上の列挙型定数を含めることができ、それぞれが列挙型のインスタンスになります。列挙定数は列挙型内で事前定義されており、オブジェクトという名前が付いた一意です

1.2 Javaの列挙型の特徴

Java の列挙型の特徴は次のとおりです。

  1. インスタンスの有限セット: 列挙型はインスタンスの有限セットであり、各インスタンスは列挙型の一意の名前付き定数です。列挙型のインスタンスは定義時に事前に決定されており、変更することはできません。

  2. 型安全性: enum 型はコンパイル時に静的に型チェックされます。つまり、enum 定数を使用するときにコンパイラが型エラーを検出できることを意味します。これにより、型の安全性が向上し、よくあるプログラミングの間違いを回避できます。

  3. 一意性と比較可能性: 各列挙定数は列挙型内で一意であり、==演算子を使用して比較できます。これにより、コード内で列挙定数を使用して正確な比較と判断が可能になります。

  4. 可読性と保守性: 列挙型の定数は意味があり、自己記述的であり、その意味を直感的に理解できます。これにより、コードがより読みやすく、理解しやすく、保守しやすくなります。同時に、列挙型の定数によって、より適切なドキュメントとコメントを提供することもできます。

  5. 反復性: 列挙型はvalues()メソッドを通じてすべての列挙定数を含む配列を取得でき、for-eachループ トラバーサルをサポートします。これにより、列挙定数の反復と操作が容易になります。

  6. メソッドとフィールドのサポート: 列挙定数にはフィールドとメソッドを含めることができ、定数ごとに特定のプロパティと動作を定義できます。これにより、関連するプロパティと操作を列挙定数内にカプセル化することが可能になります。

  7. シリアル化のサポート: 列挙型はSerializableデフォルトでインターフェイスを実装し、シリアル化および逆シリアル化できます。これにより、ネットワーク送信、ストレージ、永続化などのシナリオで列挙型を使用できるようになります。

列挙型を利用することで、名前付き定数の固定コレクションをよりエレガントに表現でき、型の安全性とコードの可読性が向上します。これらは、多くのシナリオにおいて、より簡潔で保守可能で拡張可能なソリューションを提供できます。

2 番目に、列挙型の使用

2.1 文法の作成

Java では、列挙型を作成するための構文は次のとおりです。

enum EnumName {
    
    
    CONSTANT1,
    CONSTANT2,
    // ...
}

その中に、EnumNameは列挙型の名前、CONSTANT1などCONSTANT2はカンマで区切られた列挙定数です。各列挙定数は列挙型のインスタンスであり、一意の名前付き定数オブジェクトです。

単純なシーズン列挙型を作成する例を次に示します。

enum Season {
    
    
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER
}

前述の例では、Seasonという名前の列挙型を作成します。これにはSPRING、 、SUMMERAUTUMNおよび の4 つの列挙定数が含まれますWINTER

列挙型内では、フィールドとメソッドを定義できます。たとえば、各列挙定数の特定のプロパティと動作を定義するには、次のようにします。

enum DayOfWeek {
    
    
    MONDAY(1),
    TUESDAY(2),
    WEDNESDAY(3),
    THURSDAY(4),
    FRIDAY(5),
    SATURDAY(6),
    SUNDAY(7);

    private int value;

    private DayOfWeek(int value) {
    
    
        this.value = value;
    }

    public int getValue() {
    
    
        return value;
    }
}

前の例の列挙型にはDayOfWeek7 つの列挙定数が含まれており、それぞれにvalue名前付きフィールドとgetValue()そのフィールドの値を返すメソッドがあります。

このようにして、特定の定数とカスタム プロパティおよび動作を備えた列挙型を作成できます。

2.2 一般的な方法

列挙型の一般的に使用されるメソッドとその用途を次に示します。

方法 使用
name() enum 定数の名前を取得します
ordinal() 列挙定数のシリアル番号を取得します
values() 列挙型のすべての列挙定数を取得します
valueOf(String name) 列挙定数の名前に従って、対応する列挙定数を取得します
toString() enum 定数の文字列表現を返します。
カスタムフィールドとメソッド 列挙定数には、特定のプロパティと動作を提供するカスタム フィールドとメソッドを含めることができます

これらのメソッドは列挙型で一般的に使用されるメソッドであり、列挙定数に関する情報の取得、列挙定数間の比較と変換の実行、およびカスタム操作の実行に使用できます。このメソッドを使用すると、values()列挙型のすべての列挙定数を取得し、走査と処理を実行できます。valueOf()このメソッドは、列挙定数の名前に従って、対応する列挙定数インスタンスを取得できます。

さらに、特定のニーズを満たすために列挙型でカスタム フィールドとメソッドを定義できます。たとえば、列挙型の機能を拡張するために、列挙型定数の追加のプロパティ、計算方法などを定義できます。

2.3 使用例

3 つの列挙定数および をTestEnum含む列挙クラスを作成しますRED以下は、列挙クラスの例の説明とコード分析です。GREENBLACK

public enum TestEnum {
    
    
    RED("RED", 1),
    GREEN("GREEN", 2),
    BLACK("BLACK", 3);

    private String color;
    private int ori;

    // 构造方法
    private TestEnum(String color, int ori) {
    
    
        this.color = color;
        this.ori = ori;
    }

    // 主方法
    public static void main(String[] args) {
    
    
        TestEnum[] values = TestEnum.values();
        for (TestEnum value : values) {
    
    
            System.out.println(value + " ori: " + value.ordinal());
        }

        System.out.println("======================");

        System.out.println(TestEnum.valueOf("RED"));
        System.out.println("======================");
        System.out.println(RED.compareTo(BLACK));
        System.out.println(BLACK.compareTo(GREEN));
    }
}

この例では、TestEnumenum クラスには次の特性とコードの説明があります。

  • 列挙型定数: REDGREENおよび は、BLACK列挙型クラスの 3 つのインスタンス化されたオブジェクトでありTestEnum、一意の名前付き定数です。
  • 構築メソッド: 列挙クラスの構築メソッドはデフォルトではプライベートであり、列挙クラス内でのみ使用できます。この例では、プライベート コンストラクターを使用して、各列挙定数に対応する色とプリミティブ値を設定します。
  • values()メソッド: この例では、メソッド内のメソッドをmain()使用して、列挙型クラス内のすべての列挙型定数を取得し、トラバーサル出力を実行します。TestEnum.values()TestEnum
  • valueOf(String name)方法:を通じてTestEnum.valueOf("RED")列挙定数名が「RED」である列挙オブジェクトを取得できます。
  • ordinal()メソッド: 列挙型定数のメソッドは、ordinal()列挙型で定義されている順序 (0 から始まる) で値を返します。
  • compareTo()メソッド: と を通じてRED.compareTo(BLACK)2BLACK.compareTo(GREEN)つの列挙定数の順序を比較し、整数値を返すことができます。

この例では、メソッド内でステートメントをmain()使用して、列挙定数の値に基づいてさまざまなロジックを実行する方法も示します。switch

3、列挙の長所と短所

Java では、列挙型には次のような利点と欠点があります。

アドバンテージ:

  1. 可読性と保守性: 列挙型の定数は意味があり自己記述的であるため、コードがより読みやすく、理解しやすく、保守しやすくなります。Enum 定数には一意の名前があり、より適切なドキュメントとコメントが提供されます。

  2. 型安全性: 列挙型はコンパイル時に静的に型チェックされます。つまり、コンパイラは有効な列挙型定数のみが使用されることを保証し、より高い型安全性を提供します。

  3. 制限された値のセット: 列挙型は制限された値のセットを定義し、有効な値の範囲を制限します。これは、プログラム内で無効な値や予期しない値が発生するのを避けるのに役立ちます。

  4. マジック値を回避する: 列挙型を使用すると、ハードコーディングされたマジック値を回避でき、コードの可読性と保守性が向上します。

  5. 強化されたコンパイラ サポート: 列挙型は、一般的なメソッド ( 、values())の自動追加valueOf()、列挙定数の順序など、コンパイラ レベルでの追加サポートを提供します。

  6. 状態とオプションを表すのに適しています: 列挙型は、状態、オプション、季節、色、曜日などの固定セットを表すのに最適です。

欠点:

  1. データを動的に変更する場合には適していません。列挙型はコンパイル時に定義され、その定数セットは固定されています。動的に変化するデータのコレクションを表す必要がある場合、列挙型は適切ではない可能性があります。

  2. 大規模なデータ コレクションには適さない: 大規模なデータ コレクションを表す必要がある場合、列挙型の定数定義は長くて面倒になる可能性があります。

  3. 拡張性の欠如: 列挙型の定数はコンパイル時に決定され、定数の動的な追加または削除はサポートされていません。したがって、定数セットを頻繁に変更する必要がある場合、コードの変更が発生し、メンテナンスコストが増加する可能性があります。

  4. 継承はサポートされていません。列挙型は継承をサポートしていないため、列挙型間の継承関係を実現できません。

全体として、列挙型は多くのシナリオ、特に状態、オプション、固定コレクションを表す場合に非常に役立ちます。これらは、型の安全性、可読性、保守性などの利点を提供します。ただし、列挙型は、動的に変更されるデータ コレクションや大規模なデータ コレクション、および定数コレクションの頻繁な変更が必要な状況には最適な選択ではない可能性があります。

おすすめ

転載: blog.csdn.net/qq_61635026/article/details/131621143