English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java enumの使い方と詳細な例コード

Javaエnumの使用方法

使用方法1:定数

JDK1.5 以前は、定数を定義する際には次のようにしていました:public static fianl.... 。しかし、現在ではエnumを使用して、関連する定数をエnumタイプにグループ化することができます。さらに、エnumは定数よりも多くのメソッドを提供します。

public enum Color { 
 RED, GREEN, BLANK, YELLOW 
} 

使用方法2:switch

JDK1.6前のswitch文はint、char、enumタイプのみをサポートしていましたが、エnumを使用することでコードの可読性が向上します。

enum Signal {
    GREEN, YELLOW, RED
  }
  public class TrafficLight {
    シグナルカラー = シグナル.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:エnumに新しいメソッドを追加

カスタムメソッドを定義する場合は、enumインスタンスのシーケンスの最後にセミコロンを追加する必要があります。また、Javaではenumインスタンスの定義が必須です。

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:エnumのメソッドをオーバーライド

以下にtoString()メソッドのオーバーライド例を示します。

public class Test {
  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;
    }
  }
  public static void main(String[] args) {
    System.out.println(Color.RED.toString());
  }
}

使用法5:インターフェースの実装

すべてのエnumはjava.lang.Enumクラスを継承しています。Javaでは多重継承がサポートされていないため、エnumオブジェクトは他のクラスを継承できません。

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);
    }
  }

用法六:インターフェースを使用して列挙型を組織する

public interface Food {
    enum Coffee implements Food {
      BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
    }
    enum Dessert implements Food {
      FRUIT, CAKE, GELATO
    }
  }

用法七:列挙型集合の使用について

java.util.EnumSetとjava.util.EnumMapは、2つの列挙型集合です。EnumSetでは集合内の要素が重複しないことを保証します;EnumMapではキーがenum型であり、値は任意の型になることができます。この2つの集合の使用についてはここでは説明しませんが、JDKドキュメントを参照してください。

列挙型と定数の違い

一、通常の定数の定義方法

通常、public final staticメソッドで定義するコードは以下の通りで、それぞれ1赤信号を表現します。3緑信号を表現します。2黄信号を表現します。

public class Light {
    /* 赤信号 */
    public final static int RED = 1;
    /* 緑信号 */
    public final static int GREEN = 3;
    /* 黄信号 */
    public final static int YELLOW = 2;
  }

二、列挙型定数の定義方法

列挙型の簡単な定義方法は以下の通りですが、各列挙型の値を定義する方法が見つかりません。例えば、赤信号、緑信号、黄信号の定義方法は以下のようになります:

public enum Light {
    RED, GREEN, YELLOW;
  }

赤信号、緑信号、黄信号のみを表現できますが、具体的な値は表現できません。焦らずに、列挙型が構造関数を提供しているので、構造関数とtoStringメソッドをオーバーライドすることで実現できます。まず、Light列挙型に構造メソッドを追加し、各列挙型の値を構造関数に対応する引数として渡し、toStringメソッドをオーバーライドし、そのメソッド内で構造関数から渡された引数を返すように改造したコードは以下の通りです:

public enum Light {
  // コンストラクタに引数を渡す
  RED(1), GREEN(3), YELLOW(2);
  // プライベート変数を定義
  private int nCode;
  // コンストラクタ、エnum型はプライベートでなければなりません
  private Light(int _nCode) {
    this.nCode = _nCode;
  }
  @Override
  public String toString() {
    return String.valueOf(this.nCode);
  }
}

三、完全なサンプルコード

エnum型の完全なデモコードは以下の通りです:

public class LightTest {
  // 1.エnum型を定義
  public enum Light {
    // コンストラクタに引数を渡す
    RED(1), GREEN(3), YELLOW(2);
    // プライベート変数を定義
    private int nCode;
    // コンストラクタ、エnum型はプライベートでなければなりません
    private Light(int _nCode) {
      this.nCode = _nCode;
    }
    @Override
    public String toString() {
      return String.valueOf(this.nCode);
    }
  }
  /**
   * 
   * @param args
   */
  public static void main(String[] args) {
    // 1.エnum型の遍历
    System.out.println("エnum型の遍历のデモ ......");
    testTraversalEnum();
    // 2.EnumMapオブジェクトの使用を示します
    System.out.println("EnmuMapオブジェクトの使用と遍历のデモ.....");
    testEnumMap();
    // 3.EnmuSetの使用を示します
    System.out.println("EnmuSetオブジェクトの使用と遍历のデモ.....");
    testEnumSet();
  }
  /**
   * 
   * エnum型の遍历のデモ
   */
  private static void testTraversalEnum() {
    Light[] allLight = Light.values();
    for (Light aLight : allLight) {
      System.out.println("現在の灯name:" + aLight.name());
      System.out.println("現在の灯ordinal:" + aLight.ordinal());
      System.out.println("現在の灯:" + aLight);
    }
  }
  /**
   * 
   * EnumMapの使用を示します。EnumMapはHashMapの使用とほぼ同じですが、キーはエnum型でなければなりません
   */
  private static void testEnumMap() {
    // 1.EnumMapオブジェクトの定義を示します。EnumMapオブジェクトのコンストラクタにはパラメータを渡す必要があり、デフォルトではキーのクラスのタイプです
    EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>()}}
    Light.class);
    currEnumMap.put(Light.RED, "赤信号");
    currEnumMap.put(Light.GREEN, "緑信号");
    currEnumMap.put(Light.YELLOW, "黄信号");
    // 2.オブジェクトを巡回
    for (Light aLight : Light.values()) {
      System.out.println("[key=" + aLight.name() + ",value="
      + currEnumMap.get(aLight) + "];
    }
  }
  /**
   * 
   * EnumSetの使用方法をデモします、EnumSetは抽象クラスであり、あるタイプのエnum型内容を取得します<BR/>
   * 
   * allOfメソッドを使用できます
   */
  private static void testEnumSet() {
    EnumSet<Light> currEnumSet = EnumSet.allOf(Light.class);
    for (Light aLightSetElement : currEnumSet) {
      System.out.println("現在のEnumSet中のデータは以下の通りです:" + aLightSetElement);
    }
  }
}

実行結果は以下の通りです:

エnum型の巡回のデモ...

現在の灯name:RED

現在の灯ordinal:0

現在の灯:1

現在の灯name:GREEN

現在の灯ordinal:1

現在の灯:3

現在の灯name:YELLOW

現在の灯ordinal:2

現在の灯:2

EnmuMapオブジェクトの使用と巡回のデモ...

[key=RED,value=赤信号]

[key=GREEN,value=緑信号]

[key=YELLOW,value=黄信号]

EnmuSetオブジェクトの使用と巡回のデモ...

現在のEnumSet中のデータは以下の通りです:1

現在のEnumSet中のデータは以下の通りです:3

現在のEnumSet中のデータは以下の通りです:2

四、通常の定数定義方法と列挙定数定義方法の違い

以下の内容は少し退屈かもしれませんが、ぜひ一瞥してください。

1. 代码:

public class State {
public static final int ON = 1;
public static final Int OFF= 0;
}

何が悪いですか、みんなが長い間これを使っていますし、何か問題はありません。

まず、それはタイプセーフではありません。intであることを確実にする必要があります。

次に、その範囲が0と1

最後に、多くの場合、印刷するときに、あなたが見るのは 1 と0 、

コードを見ていない人にはあなたの意図がわからないため、すべての古いpublic static final定数を捨ててください。

2. enumクラスを作成し、それを通常のクラスとして見ることができます。ただし、他のクラスを継承することはできません。(Javaは単一継承であり、Enumは既に継承しています)

他のメソッドを追加して、それ自身のメソッドをオーバーライドすることができます。

3. switch()パラメータにはenumを使用できます。

4. values()メソッドはコンパイラがenum定義に挿入するstaticメソッドであり、したがって、enumインスタンスを親クラスEnumにアップキャストした場合、values()はアクセスできません。解決策:ClassにはgetEnumConstants()メソッドがあり、したがって、Enumインターフェースにはvalues()メソッドがない場合でも、すべてのenumインスタンスを取得することができます。

5. enumからサブクラスを継承することはできません。enumを拡張する必要がある場合は、インターフェースの内部でそのインターフェースを実装するenumを作成し、要素をグループ化します。これにより、enum要素をグループ化します。

6. EnumSetを使用してフラグを置き換えます。enumはメンバーがユニークであることを要求しますが、enum中では要素を削除または追加することはできません。

7. EnumMapのキーはenum、値は任意の他のObjectオブジェクトです。

8. enumはプログラマーがenumインスタンスにメソッドを書けるようにします。したがって、各enumインスタンスに異なる行動を割り当てることができます。

9. enumの責任連鎖(Chain of Responsibility)を使用します。これはデザインパターンの責任連鎖パターンに関連しています。問題を解決するためのさまざまな方法を用いて、それらをリンクします。リクエストが来たときは、リクエストを処理できる解決策があるまで、連鎖を遍历します。

10. enumの状態機を使用します。

11. enumを使用してマルチパスを分散します。

 ご読阅ありがとうございます。皆様のサポートに感謝します!

おすすめ