1. 程式人生 > >Java之枚舉類

Java之枚舉類

一個 核心 bre 全部 image system 知識 變量 highlight

有時候,變量的取值只在一個有限的集合內。

例如: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之枚舉類