Javaエニュメレーションの種類のenumの詳しい解と使用

6326 ワード

Javaエニュメレーションの種類のenumの詳しい解と使用
最近同僚と問題を討論する時、突然同僚は私達がどうしてJavaの中で定義する定数値がenmuの列挙のタイプを採用しないことを言及して、public final staticのタイプを採用して定義に来ますか?以前は私達はこのような方式で定義していましたが、enumの定義はあまり採用されていませんので、注意したことがありません。突入した問題に対しては、なぜこのような定義があるのかよく分かりません。分かりませんでしたから、時間を作って検討してみましょう。
Javaのエニュメレーションの種類はキーワードenumで定義されています。jdk 1.5からしかない新しいタイプです。すべてのエニュメレーションの種類はエムから継承されています。列挙の種類を理解するには、jdkのEnum類を開いて簡単に読むことをお勧めします。このクラスには多くのprotected方法が定義されています。例えば、コンストラクションなど、これらの方法を使うなら、列挙の種類を現在のクラスに定義できます。各列挙の種類には、自分の名前と順番があります。列挙の種類を出力すると、列挙の種類のnameが入力されます。具体的には次の例を参考にしてください。
一、   一般的に定数を定義する方法
私たちは通常public final staticを利用して定義しています。コードは以下の通りです。それぞれ1で赤信号を表し、3は緑信号を表し、2は黄色灯を表します。

package com.csdn.myEnum;
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 ;
}
赤信号と青信号と黄色灯しか表示できませんが、具体的な値は表示できません。急がないでください。エニュメレーションの種類が構造関数を提供していますので、構造関数と上書きtoSteringの方法で実現できます。まず、Lightエニュメレーションの種類に構造方法を追加し、各エニュメレート・タイプの値を構成関数によって対応するパラメータに入力し、同時にtoString方法を上書きし、この方法では構造関数から入ってきたパラメータを返します。

public enum Light {
    //         
    RED (1), GREEN (3), YELLOW (2);
 
    //       
    private int nCode ;
 
    //     ,         
    private Light( int _nCode) {
      this . nCode = _nCode;
    }
 
    @Override
    public String toString() {
      return String.valueOf ( this . nCode );
    }
  }
 
三、   完全な例示コード
列挙の種類の完全なデモコードは以下の通りです。

package com.csdn.myEnum;
 
import java.util.EnumMap;
import java.util.EnumSet;
 
public class LightTest {
 
  // 1.       
  public enum Light {
    //         
    RED (1), GREEN (3), YELLOW (2);
 
    //       
    private int nCode ;
 
    //     ,         
    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.       
    System. out .println( "           ......" );
    testTraversalEnum ();
 
    // 2.    EnumMap      
    System. out .println( "    EnmuMap          ....." );
    testEnumMap ();
 
    // 3.    EnmuSet    
    System. out .println( "    EnmuSet          ....." );
    testEnumSet ();
  }
 
  /**
   *          
   */
  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       ,    key       
   */
  private static void testEnumMap() {
    // 1.      EnumMap   , EnumMap               ,    key      
    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       ,             <BR/>
   *      allOf   
   */
  private static void testEnumSet() {
    EnumSet<Light> currEnumSet = EnumSet.allOf (Light. class );
    for (Light aLightSetElement : currEnumSet) {
      System. out .println( "    EnumSet     : " + aLightSetElement);
    }
 
  }
}
 
 
実行結果は以下の通りです。

          ......
    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.    エンム類を作って、普通の種類と見なしてもいいです。それ以外は他のクラスを引き継ぐことができません。javaは単一継承であり、Enumを継承しました。
他の方法を追加して、それ自体をカバーする方法があります。
3.    switch()パラメータはenumを使用できます。 
4.    values()方法はコンパイラをenum定義に挿入するstatic方法です。だから、enumのインスタンスを上に父の種類のEumに変換する時は、values()はアクセスできません。解決方法:クラスの中に一つのget Enum Contents()の方法があります。だから、Enumインターフェースの中にvalues()の方法がなくても、私達は依然としてクラスの対象を通じてすべてのenumの実例を取得できます。 
5.    enumからサブクラスを継承できませんでした。enumの中の要素を拡張する必要があれば、インターフェースの内部に、このインターフェースを実現するための列挙を作成し、要素をグループ化します。エニュメレート・エレメントをグループ化するに至ります。 
6.    エンマセットをマークの代わりに使います。エンムはメンバーに唯一の要求をしますが、エンムから添加元素を削除することはできません。 
7.    EnumMapのkeyはenumで、valueは他のObjectの対象です。 
8.    enumはプログラマがeunmの実例のために方法を編纂することを許可します。したがって、各enumのインスタンスには、それぞれ異なる行動を与えることができる。 
9.    エンムの職責チェーンを使用して、これは設計モードの職責チェーンパターンに関係します。さまざまな方法で一つの問題を解決します。そして彼らをリンクします。要求が到来すると、このチェーンを巡回し、チェーンの中のある解決策が要求を処理することができるまで。 
10.   enumを使った状態機 
11.   enumを使って多重に分けます。
 読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。