三十六、列挙

6606 ワード

1.列挙導入
C言語にはエニュメレート・タイプがあり、このタイプによってコンテンツの取得範囲を制限することができますが、JDK 1.5の前に、javaにはエニュメレート・タイプが存在しません。JDK 1.5の後にエニュメレート・タイプが追加されました。
列挙がない場合の色を限定するクラスの実施例:
package com.ares.demo;
public class Color {
	private String name;
	private static final Color RED = new Color("  ");
	private static final Color GREEN = new Color("  ");
	private static final Color BLUE = new Color("  ");
	private Color(String name) {
		this.name = name;
	}
	public static Color getInstance(int num) {
		if (num == 0) {
			return RED;
		}
		if (num == 1) {
			return GREEN;
		}
		if (num == 2) {
			return BLUE;
		}
		return null;
	}

	public String getName() { 
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}
以上のコードは構造方法を私有化する操作ですので、今後はstatic属性でColorの実例化対象を得るか、get Instance()方法で取得します。
インターフェースの形で定義することもできます。
public interface Color {
	public static final int RED = 0;
	public static final int GREEN = 1;
	public static final int BLUE = 2;
}
でもこれは違う意味があります。
2.enumキーワード
エンムで列挙のタイプを定義します。
列挙の定義:
public enum Color {

    RED, GREEN, BLUE;//        

}
出力:
for (Color c : Color.values()) { //          

    System.out.println(c);

}    //ordinal()         .
3.Enum類とenumキーワードの違い
エンムキーワードを使ってエニュメレート・タイプを定義することができますが、実際には一つのクラスを定義することに相当します。このような種類はエンム類を継承しました。
例:
Color c = Color.valueOf(Color.class, "RED"); //    
System.out.println(c.ordinal() + " --> " + c.name());
System.out.println(Color.RED.ordinal() + " --> " + Color.RED.name());
4.類集の列挙へのサポート
4.1 EnumMap例
Mapインターフェースのサブクラスは、Map操作と似ています。
import java.util.EnumMap;

public class EnumMapDemo {

	public static void main(String[] args) {
		EnumMap<Color, String> emap = new EnumMap<Color, String>(Color.class);
		emap.put(Color.RED, "  ");
		emap.put(Color.GREEN, "  ");
		emap.put(Color.BLUE, "  ");
		System.out.println(emap.get(Color.RED)); ;

	}

}
4.2エムセットの例
Setインターフェースのサブクラスは、このような構造方法の定義がなく、構造方法が私有化されたことを示しています。このような方法はすべて静的です。
import java.util.EnumSet;

public class EnumSetDemo {

	public static void main(String[] args) {
		EnumSet<Color> eset = null;
		eset = EnumSet.allOf(Color.class); //             
		for (Color x : eset) {
			System.out.println(x);
		}
	}

}
注:
列挙の構造方法はカスタマイズできますが、Publicではなく、列挙の内部構造方法に外部からアクセスできないからです。
列挙においても、複数の抽象的な方法を定義することができ、このインターフェースは、列挙の各オブジェクトが単独で実現しなければならない。
5.列挙の総合応用
package com.ljq.test;

/**
 *       
 *      
 */
public class TestEnum {
    /**
     *     
     * 
     */
    public enum ColorEnum {
        red, green, yellow, blue;
    }
    
    /**
     *                   ,                  
     * 
     */
    public enum SeasonEnum {
        // :       ,      
        spring, summer, autumn, winter;

        private final static String position = "test";

        public static SeasonEnum getSeason() {
            if ("test".equals(position))
                return spring;
            else
                return winter;
        }
    }
    
    /**
     *   
     * 
     *           
     * 
     */
    public enum Gender{
        //      ,                    ,      
        //            ,             ;            ,       
        MAN("MAN"), WOMEN("WOMEN");
        
        private final String value;

        //         private,                
        Gender(String value) {
            this.value = value;
        }
        
        public String getValue() {
            return value;
        }
    }
    
   /**
    *     
    * 
    *            
    * 
    */
    public enum OrderState {
        /**     */
        CANCEL {public String getName(){return "   ";}},
        /**     */
        WAITCONFIRM {public String getName(){return "   ";}},
        /**      */
        WAITPAYMENT {public String getName(){return "    ";}},
        /**      */
        ADMEASUREPRODUCT {public String getName(){return "    ";}},
        /**      */
        WAITDELIVER {public String getName(){return "    ";}},
        /**     */
        DELIVERED {public String getName(){return "   ";}},
        /**     */
        RECEIVED {public String getName(){return "   ";}};
        
        public abstract String getName();
    }
    
    public static void main(String[] args) {
        //       ,      ,        ;     “   . ”       
        ColorEnum colorEnum = ColorEnum.blue;
        switch (colorEnum) {
        case red:
            System.out.println("color is red");
            break;
        case green:
            System.out.println("color is green");
            break;
        case yellow:
            System.out.println("color is yellow");
            break;
        case blue:
            System.out.println("color is blue");
            break;
        }
        
        //    
        System.out.println("  ColorEnum     ");
        for(ColorEnum color : ColorEnum.values()){
            System.out.println(color);
        }
        
        //       
        System.out.println("ColorEnum      "+ColorEnum.values().length+" ");
        
        //         ,   0  
        System.out.println(ColorEnum.red.ordinal());//0
        System.out.println(ColorEnum.green.ordinal());//1
        System.out.println(ColorEnum.yellow.ordinal());//2
        System.out.println(ColorEnum.blue.ordinal());//3
        
        //       java.lang.Comparable  
        System.out.println(ColorEnum.red.compareTo(ColorEnum.green));//-1
        
        //--------------------------
        System.out.println("===========");
        System.err.println("   " + SeasonEnum.getSeason());
        
        
        //--------------
        System.out.println("===========");
        for(Gender gender : Gender.values()){
            System.out.println(gender.value);
        }
       
        //--------------
        System.out.println("===========");
        for(OrderState order : OrderState.values()){
            System.out.println(order.getName());
        }
    }
    
}
参照:
http://www.cnblogs.com/linjiqin/archive/2011/02/11/1951632.html
2050524
JAVA学習ノートシリーズ
------------------------------
                    連絡先
------------------------------
        Weibo:ARESXIONG
        E-Mail:[email protected]
------------------------------