再談java枚舉 ENUM


沒有枚舉之前:

  在沒有枚舉之前,我們想列舉一些相關的常量,我們會采用如下的方式:

interface ActionInterface {
	public static final int RIGHT = 0;
	public static final int LEFT = 1;
}

  然后在某個類似於下面的方法中,使用這些常量:

	public void playWithInterface(int num) {
		switch (num) {
		case ActionInterface.RIGHT:
			System.out.println("RIGHT");
			break;
		case ActionInterface.LEFT:
			System.out.println("LEFT");
			break;
		default:
			System.out.println("Default");
		}
	}

  不知道你注意了沒,在這樣做的時候,請記住這類常量是 Java 中 int 類型的常量,這意味着該方法可以接受任何 int 類型的值,即使它和之前的接口中定的所有常量都不對應。因此,您需要檢測上界和下界,在出現無效值的時候,你只能依賴switch中的default或者其他的處理手段,而且,如果后來又添加另外一個常量的時候,那么你就必須改變很多相關聯代碼中的上界,下界處理程序,才能接受這個新值。

有了枚舉之后:

  你應該對於這種情況,總是使用枚舉,比如:

enum ActionEnum{
	RIGHT,LEFT
}

  然后在某個類似於下面的方法中,使用它們:

	public void playWithEnum(ActionEnum actionEnum) {
		switch (actionEnum) {
		case RIGHT:
			System.out.println("RIGHT");
			break;
		case LEFT:
			System.out.println("LEFT");
			break;
		default:
			System.out.println("Default");
		}
	}

  這樣,你就不必費很大的心思去檢查之前的一些問題,而且即便需求修改之后,添加了一些相關的變量,你只需要修改ActionEnum就行,其余代碼都不需要修改。

  需要注意的是,在上面的switch中,我們使用的是case RIGHT... 而不是case ActionEnum.RIGHT(這樣會出錯),原因是枚舉重寫了ToString(),也就是說枚舉變量的值是不帶前綴的。

上面所說的,可能並不能完全顯示出枚舉類型的優勢,但是確實我們經常采用的形式。下面我們來盡可能的認識一下枚舉:

package com.java;

public class EnumDemo {
	/**
	 * 最簡單的枚舉示例
	 * */
	public enum SimpleEnum {
		UP, DOWN
	}
	
	/**
	 * 帶有屬性和方法的枚舉示例
	 * 注意:枚舉本身也是類,可以象一般的類一樣為它添加靜態或者非靜態的屬性或方法
	 * 		  但是枚舉列表必須寫在最前面,否則編譯出錯。比如本例中的UP,DOWN
	 * */
	public enum EnumWithFuncAndAttr {
		UP, DOWN;
		private static final String description = "這個是一個有方法和屬性的枚舉示例";

		public String getDescription() {
			return description;
		}
	}
	
	/**
	 * 帶有構造函數的枚舉示例
	 * 注意:枚舉可以有構造方法,通過括號賦值。如果不賦值,那么就不能編寫構造方法,否則出錯。
	 * 構造方法只能是private的或者默認的。而不能是public以及protected,否則出錯。這樣做可以保證客戶代碼沒有辦法新建一個enum的實例
	 * */
	public enum EnumWithConstructor{
		UP("hello"),DOWN("java");
		private final String value;
		String getValue(){
			return value;
		}
		EnumWithConstructor(String value){
			this.value=value;
		}
	}
	
	public static void main(String[] args) {
		System.out.println(SimpleEnum.values().length);
		System.out.println(SimpleEnum.UP);
		System.out.println(SimpleEnum.valueOf("UP"));
		for (EnumWithConstructor item : EnumWithConstructor.values()) {
			System.out.println(item+" "+item.getValue());
		}
		System.out.println(SimpleEnum.UP.ordinal());
	}
}

  總結:

  1.枚舉本身就是一個類。

  2.它不能有public的構造函數,這樣做可以保證客戶代碼沒有辦法新建一個enum的實例。     

  3..所有枚舉值都是public static final的。注意這一點只是針對於枚舉值,我們可以和在普通類里面定義變量一樣定義其它任何類型的非枚舉變量,這些變量可以用任何你想用的修飾符。     

  4.Enum默認實現了java.lang.Comparable接口。     

  5.Enum覆載了了toString方法,因此我們如果調用Color.Blue.toString()默認返回字符串”Blue”.

  6.Enum提供了一個valueOf方法,這個方法和toString方法是相對應的。調用valueOf(“Blue”)將返回Color.Blue.因此我們在自己重寫toString方法的時候就要注意到這一點,一般來說應該相對應地重寫valueOf方法。     

   7.Enum還提供了values方法,這個方法使你能夠方便的遍歷所有的枚舉值

  8.Enum還有一個oridinal的方法,這個方法返回枚舉值在枚舉類種的順序。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM