public enum Season { winter, spring, summer, fall }
?
一個enum是定義一組值的對象,它可以包括零個或多個值成員.它是屬于enum類型的,一個enum對象中不可有兩個或多個相同的屬性或值.在次之前的java程序員一般是 用接口的方法實現列舉的,如 :
public interface Season {
?? static winter = 0;
?? static spring = 1; //etc..
}
引入了enum的java的列舉的編寫方便了許多,只須定義一個enum型的對象.enum對象的值都回自動獲得一個數字值,從0開始,依次遞增.看一個比較簡單的enum實現的例子:
EnumDemo.java
package net.javagarage.enums;
?
/*
We can loop over the values we put into the enum
using the values() method.
Note that the enum Seasons is compiled into a
separate unit, called EnumDemo$Seasons.class
*/
public class EnumDemo {
?
????? /*declare the enum and add values to it. note that, like in C#, we don't use a ; to
?end this statement and we use commas to separate the values */
?
????? private enum Seasons { winter, spring,
?????? summer, fall }
?
????? //list the values
????? public static void main(String[] args) {
??????????? for (Seasons s : Seasons.values()){
????????????????? System.out.println(s);
??????????? }
????? }
?
}
運行上述代碼你回得到 以下結果:
winter
spring
summer
fall
Enum的屬性調用:
下面的代碼展示了調用enum對象的方法,這也是它通常的用法:
package net.javagarage.enums;
/*
File: EnumSwitch.java
Purpose: show how to switch against the values in an enum.
*/
?
public class EnumSwitch {
?
????? private enum Color { red, blue, green }
?
????? //list the values
????? public static void main(String[] args) {
??????????? //refer to the qualified value
??????????? doIt(Color.red);
?
????? }
?
????? /*note that you switch against the UNQUALIFIED name. that is, "case Color.red:" is a
?compiler error */
?
????? private static void doIt(Color c){
?
????? switch (c) {
????? case red:
??????????? System.out.println("value is " + Color.red);
??????????? break;
????? case green:
??????????? System.out.println("value is " + Color.green);
??????????? break;
????? case blue:
??????????? System.out.println("value is : " + Color.blue);
??????????? break;
????? default :
??????????? System.out.println("default");
????? }
????? }
}
為enums添加屬性和方法
enums也可以象一般的類一樣添加方法和屬性,你可以為它添加靜態和非靜態的屬性或方法,這一切都象你在一般的類中做的那樣.
package net.javagarage.enums;
?
/*
File: EnumDemo.java
Purpose: show how to use an enum that also defines its own fields and methods
*/
?
public class EnumWithMethods {
?
//declare the enum and add values to it.
?
public enum Season {
?
????? winter, spring, summer, fall;
?
????? private final static String location = "Phoenix";
?
????? public static Season getBest(){
??????????? if (location.equals("Phoenix"))
????????????????? return winter;
??????????? else
????????????????? return summer;
?
????? }
?
????? public static void main(String[] args) {
?
????? System.out.println(Season.getBest());
????? }
}
就是這么的簡單.但是有一點是需要注意的,那就是enums的值列表必須緊跟在enum聲明,不然編譯時將會出錯.
Enums構造函數:
和類一樣enums也可以有自己的構造函數,如下:
package net.javagarage.enums;
?
public class EnumConstructor {
?
????? public static void main(String[] a) {
?
??????????? //call our enum using the values method
??????????? for (Temp t : Temp.values())
????????????????? System.out.println(t + " is : " + t.getValue());
????? }
?
????? //make the enum
????? public enum Temp {
??????????? absoluteZero(-459), freezing(32),
??????????? boiling(212), paperBurns(451);
?
????? //constructor here
????? Temp(int value) {
??????????? this.value = value;
????? }
?
????? //regular field?but make it final,
????? //since that is the point, to make constants
????? private final int value;
?
????? //regular get method
????? public int getValue() {
????? return value;
????? }
?
????? }
}
輸出結果是:
absoluteZero is : -459
freezing is : 32
boiling is : 212
paperBurns is : 451
盡管enums有這么多的屬性,但并不是用的越多越好,如果那樣還不如直接用類來的直接.enums的優勢在定義int最終變量僅當這些值有一定特殊含義時.但是如果你需要的是一個類,就定義一個類,而不是enum.