1. 程式人生 > 其它 >Java SE 列舉型別詳解

Java SE 列舉型別詳解

列舉的使用


一、列舉的歷史

列舉是jdk1.5版本推出的,主要作用是確定某一個範圍裡的值

早先時候,程式設計師使用列舉需要通過定義類的方式來使用

public class Color{
	private String name;
	public static final Color RED = new Color("紅色");
	public static final Color GREEN = new Color("綠色");
	public static final Color BLUE = new Color("藍色");

	public String getName(){
		return name;
	}

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

	//私有建構函式
	private Color(String name){
		this.setName(name);
	}

	public static Color getInstance(int i){
		if(i == 0) return RED;
		if(i == 1) return GREEN;
		if(i == 2) return BLUE;
		return null;
	}
}

呼叫時則應該先獲取例項,再呼叫例項的getName方法

可以看到這種方法非常不方便


二、正式使用列舉

列舉的定義方法

public enum Color{RED,BLUE,PURPLE;}

列舉的使用方法

//列舉的簡單使用
public class Main {
    public static void main(String[] args) {
        Color c = Color.RED;
        System.out.println(c);
    }
}//output:RED

列舉類和列舉關鍵字

列舉類指Enum,是規定列舉型別的母類。而列舉關鍵字則是定義了一個列舉,使用列舉關鍵字建立列舉時自動繼承Enum。
設定列舉物件會呼叫列舉類的受保護的構造方法

列舉類包含更多常用的方法,方便程式碼編寫

列舉類集的使用
EnumMap繼承了Map介面,使用起來與Map沒有區別,唯一的區別是建構函式中需要傳入一個Enum類

public class Main {
    public static void main(String[] args) {
        EnumMap<Color, String> eMap = new EnumMap<Color, String>(Color.class);
        eMap.put(Color.RED, "red");
        eMap.put(Color.PURPLE, "purple");
        eMap.put(Color.BLUE, "blue");
        for (Map.Entry<Color, String> me : eMap.entrySet())
            System.out.println(me.getKey() + "--->" + me.getValue());
    }
}
//output:RED--->red BLUE--->blue PURPLE--->purple

EnumSet是一個抽象類,是Set介面的子類,沒有明顯的構造方法,此類的方法都是靜態操作
allOf方法將列舉所有的內容設定到集合
noneOf方法返回一個空集合

public static void main(String[] args) {
        EnumSet<Color> eSet = EnumSet.allOf(Color.class);
        Iterator<Color> iterator = eSet.iterator();
        while (iterator.hasNext())
            System.out.println(iterator.next());
    }

列舉的建構函式方法
列舉可以直接定義構造方法,但需要注意的是,一旦定義,所有的列舉物件都必須明確的呼叫此方法。
列舉的構造方法不能是public,因為不允許外部呼叫。每一個列舉物件都有自己的name屬性。

public enum Color {
    //這裡明確地呼叫了構造方法
    RED("紅色"),BLUE("藍色"),PURPLE("紫色");
    private String name;

    public String getName() {
        return name;
    }

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

    Color (String name){
        this.setName(name);
    }
}

列舉介面
列舉介面可以定義一個抽象方法,列舉類可以實現該介面,如果沒有定義列舉構造方法。則列舉類的每一個物件都需要實現列舉介面中定義的方法

public interface Info {
    String getColor();
}
public enum Color implements Info {

    RED{
        @Override
        public String getColor() {
            return "紅色";
        }
    },

    GREEN {
        @Override
        public String getColor() {
            return "綠色";
        }
    },

    PURPLE {
        @Override
        public String getColor() {
            return "紫色";
        }
    }

}

在列舉中定義抽象方法
和介面類似,可以在列舉中定義多個抽象方法。如果列舉中沒有構造方法,則列舉中每個物件都需要實現該抽象方法.

public enum Color{

    RED{
        @Override
        public String getColor() {
            return "紅色";
        }
    },

    GREEN {
        @Override
        public String getColor() {
            return "綠色";
        }
    },

    PURPLE {
        @Override
        public String getColor() {
            return "紫色";
        }
    }

    public abstract String getColor();

}