Java進級編-Java Enumの使い方の詳細


用法一:定数JDK 1.5より前に、定数を定義するのはすべて:public static fianl.....ここで、列挙があれば、関連する定数を1つの列挙タイプにグループ化することができ、列挙は定数よりも多くの方法を提供します.
public enum Color {  
  RED, GREEN, BLANK, YELLOW  
}

用法二:switch
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;
            }
        }
    }

使用法3:列挙に新しいメソッドを追加する
独自のメソッドをカスタマイズする場合は、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;
        }
    }

使用法四:列挙を上書きする方法
以下に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:実装インタフェースのすべての列挙は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);
        }
    }

使用法6:インタフェースを使用して列挙を整理する
public interface Food {
        enum Coffee implements Food {
            BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
        }

        enum Dessert implements Food {
            FRUIT, CAKE, GELATO
        }
    }

使用法7:列挙集合の使用についてjava.util.EnumSetとjava.util.EnumMapは2つの列挙集合である.EnumSetは、集合内の要素が重複しないことを保証します.EnumMapのkeyはenumタイプであり、valueは任意のタイプであってもよい.この2つの集合の使用については、ここでは、JDKドキュメントの列挙と定数定義の違い1、通常定数定義方法を参照してください.一般的に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;

    //     ,         
    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<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.enumクラスを作成して、普通のクラスと見なすことができます.他のクラスを継承することはできません.(javaは単一継承で、Enumは継承されています)、他のメソッドを追加して、それ自体を上書きすることができます.3.switch()パラメータはenumを使用できます.4.values()メソッドは、コンパイラがenum定義に挿入するstaticメソッドです.そのため、enumインスタンスを親Enumにアップコンバートすると、values()はアクセスできません.解決策:ClassにgetEnumConstants()メソッドがあるので、Enumインタフェースにvalues()メソッドがなくても、Classオブジェクトですべてのenumインスタンスを取得できます.5.enumからサブクラスを継承できません.enumの要素を拡張する必要がある場合は、インタフェースの内部にインタフェースを実装する列挙を作成し、要素をグループ化します.列挙要素をグループ化します.6.フラグの代わりにEnumSetを使用します.Enumではメンバーが一意であることが要求されますが、enumでは追加要素を削除できません.7.EnumMapのkeyはenumであり、valueは他のObjectオブジェクトである.8.enumでは、プログラマがeunmインスタンスのメソッドを記述できるようにします.したがって、enumインスタンスごとに異なる動作を付与することができる.9.enumの職責チェーン(Chain of Responsibility)を使用します.これは設計モードの職責チェーンモードに関係します.いろいろな方法で一つの問題を解決する.そして彼らをリンクします.1つのリクエストが来ると、チェーン内のソリューションがリクエストを処理できるまで、このチェーンを巡回します.10.enumを使用するステートマシン11.enumを使用した多重配信