Java之枚舉類
有時候,變量的取值只在一個有限的集合內。
例如:pizza的大小只有小、中、大和超大這四種尺寸。當然,可以將這些尺寸分別編碼為1、2、3、4或者S、M、L、X。但這樣存在著一定的隱患。在變量中很有可能保存的是一個錯誤的值(如0和m)。
針對這種情況,可以自定義枚舉類型。枚舉類型包括有限個命名的值。例如,
enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};
現在,可以聲明這種類型的變量:
Size s = Size.MEDIUM;
Size類型的變量只能存儲到這個類型聲明中給定的某個枚舉值,或者null值,null表示這個變量沒有設置任何值。
下面是他的完整代碼加運行結果:
package enums; import java.util.Scanner; /** * 詳解請看:Java核心技術(原書第十版)p188-189 * @author 大淩軒 * */ public class EnumTest { public static void main(String[] args) { Scanner in=new Scanner(System.in); System.out.print("Enter a size:(SMALL,MEDIUM,LARGE,EXTRA_LARGE)"); String input=in.next().toUpperCase(); //這裏解釋下此處toUpperCase方法,就是將你鍵盤輸入的字母格式化為大寫,下面有運行圖 Size size=Enum.valueOf(Size.class, input); System.out.println("size="+size); System.out.println("abbreviation="+size.getAbbreviation()); if(size==Size.EXTRA_LARGE) System.out.println("Good job--you paid attention to the _."); } } enum Size{ SMALL("S"),MEDIUM("M"),LAREG("L"),EXTRA_LARGE("XL"); private Size(String abbreviation){this.abbreviation=abbreviation;} public String getAbbreviation(){return abbreviation;} private String abbreviation; }
下面為了自己以後方便理解,對其進行詳細解釋:
public enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};
實際上,這個聲明定義的類型是一個類,它剛好有四個實例,在此盡量不要構造新對象。
因此,在比較兩個枚舉類型的值時,永遠不要調用equals,而直接使用“= =”就可以了。
如果需要的話,可以在枚舉類型中添加一些構造器、方法和域。當然,構造器只是在構造枚舉常量的時候被調用。小面是一個示例:
public enum Size{ SMALL("S"),MEDIUM("M"),LARGE("L"),EXTRA_LARGE("XL"); private String abbreviation; private Size(String abbreviation){this.abbreviation=abbreviation;} public String getAbbreviation(){return abbreviation;} }
所有的枚舉類型都是Enum類的子類。它們繼承了這個類的許多方法。其中最有用的一個是toString,這個方法能夠返回枚舉常量名。例如,Size.SMALL.toString()將返回字符串“SMALL”。
toString的逆方法是靜態方法valueOf。例如,語句:
Size s = Enum.valueOf(Size.class,"SMALL");
將s設置成Size.SMALL。
每個枚舉類型都有一個靜態的values方法,它將返回一個包含全部枚舉值的數組。例如,如下調用
Size[] values = Size.values();
返回包含元素Size.SMALL,Size.MEDIUM,Size.LARGE,Size.EXTRA_LARGE的數組。
ordinal方法返回enum聲明中枚舉常量的位置,位置從0開始計數。例如:Size.MEDIUM.ordinal()返回1。
代碼其實是最能體現出知識內容的載體,上面的解釋其實起不到太大的作用,你讀懂了代碼,也就知道個八九不離十了。
以上是我看《Core Java Volume I-Fundamentals》第十版的筆記
關於枚舉的實現細節和原理也可參考《ThinkingInJava》第四版:http://blog.lichengwu.cn/java/2011/09/26/the-usage-of-enum-in-java/
Java之枚舉類