Java Eumの使い方について詳しく説明します。

8458 ワード

Java Eumの使い方について詳しく説明します。
使い方一:定数
JDK 1.5の前に、私達は定数を定義します。public static fianlです。今はいいです。エニュメレーションがあります。関連する定数を一つのエニュメレート・タイプにグループ化して、エニュメレーションは常量より多い方法を提供します。
public enum Color {  
    RED, GREEN, BLANK, YELLOW  
} 
使い方二:スイッチ
JDK 1.6前のswitch文はint、char、enumタイプだけをサポートしています。列挙を使って、コードの読み取り可能性をより強くします。
enum Signal {
    GREEN, YELLOW, RED
}

public class TrafficLight {
    Signal color = Signal.RED;

    public void change() {
        switch (color) {
        case RED:
            color = Signal.GREEN;
            break;
        case YELLOW:
            color = Signal.RED;
            break;
        case GREEN:
            color = Signal.YELLOW;
            break;
        }
    }
}
用法三:列挙に新しい方法を追加する
自分の方法をカスタマイズするには、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;
    }
}
使い方四:列挙を覆う方法
String()方法でカバーされる例を以下に示す。
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());
    }
}
使い方五:実現インターフェース
すべての列挙はjava.lang.Enum類から継承されています。Javaは継承がサポートされていないため、列挙対象は他のクラスを引き継ぐことができません。
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は二つの列挙の集まりです。EnumSetは、集合中の要素が重複しないことを保証する。EumMapのkeyはenumタイプですが、valueは任意のタイプです。この二つのセットの使用についてはここで詳しく説明しません。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;
}
赤信号と青信号と黄色灯しか表示できませんが、具体的な値は表示できません。急がないでください。エニュメレーションの種類が構造関数を提供していますので、構造関数と上書き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);

    }

}
三、完全な例示コード
列挙の種類の完全なデモコードは以下の通りです。
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 currEnumMap = new EnumMap(

        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      ,             
* * allOf */ private static void testEnumSet() { EnumSet 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
四、通常は定数方法と列挙定義定数方法の違いを定義する。
  • コード:public class State{
     public static final int ON = 1;
     
     public static final Int OFF= 0;
    
    }何か悪いことがあったら、みんなはこのように長い時間を使いました。大丈夫です。まず、安全なタイプではありません。あなたが確認しなければならないのはintの次で、あなたはまだその範囲が0と1の最後であることを確保して、多くの時にあなたがプリントアウトした時、あなたは1と0だけを見て、しかしそのコードを見ていない人はあなたの意図を知らないで、あなたのすべての古いpublic static final定数
  • を捨てます。
  • はenum類を作成して、普通の種類と見なします。それ以外は他のクラスを引き継ぐことができません。(javaは単一継承であり、既にEnumを継承している)他の方法を追加して、それ自体をカバーする方法
  • switch()パラメータはenumを使用できます。
  • values()方法は、コンパイラがenum定義に挿入されたstatic方法であるので、enumのインスタンスを上にすると、親のEumに変換されます。values()はアクセスできません。解決方法:Classにはget Enum Contacts()の方法がありますので、もしEnumインターフェースにvalues()の方法がなくても、Classオブジェクトを通じてすべてのenumインスタンス
  • を取得できます。
  • は、enumからサブクラスを継承することができません。enum中の要素を拡張する必要があれば、インターフェースの内部に、このインターフェースを実現するための列挙を作成し、要素をグループ化します。エニュメレート・エレメントをグループ化するに至ります。
  • は、エンマセットの代替マークを使用する。エンムはメンバーに唯一の要求をしますが、エンムから添加元素を削除することはできません。
  • EnumMapのkeyはenumであり、valueは他のObjectのオブジェクトでもあります。
  • enumは、プログラマがeunmのインスタンスの作成方法を許可する。したがって、各enumのインスタンスには、それぞれ異なる行動を与えることができる。
  • はenumの職責チェーンを使用しています。これは設計モードの職責チェーンパターンに関係しています。さまざまな方法で一つの問題を解決します。そして彼らをリンクします。要求が到来すると、このチェーンを巡回し、チェーンの中のある解決策が要求を処理することができるまで。
  • enumを使用した状態機
  • enum多重を使って
  • を分配します。