1. 程式人生 > >開發日常小結(9):如何在專案中定位列舉類的作用,並使用列舉類?-- 列舉類描述業務物件狀態的例項詳解

開發日常小結(9):如何在專案中定位列舉類的作用,並使用列舉類?-- 列舉類描述業務物件狀態的例項詳解

2018年4月11日

列舉類在專案中,作為常量狀態經常被使用,剛剛開始接觸時還有點不適應,現在已經能夠靈活的使用了。

【1】概念

  先看一個簡單的列舉類。

package enumcase;

public enum SeasonEnum {
    SPRING,SUMMER,FALL,WINTER;
}
  1. enum和class、interface的地位一樣
  2. 使用enum定義的列舉類預設繼承了java.lang.Enum,而不是繼承Object類。列舉類可以實現一個或多個介面。
  3. 列舉類的所有例項都必須放在第一行展示,不需使用new 關鍵字,不需顯式呼叫構造器。自動新增public static final修飾。
  4. 使用enum定義、非抽象的列舉類預設使用final修飾,不可以被繼承。
  5. 列舉類的構造器只能是私有的。

【2】列舉類使用

  列舉類內也可以定義屬性和方法,可是是靜態的和非靜態的。

複製程式碼
package enumcase;

public enum SeasonEnum {
    SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");
    
    private final String name;
    
    private SeasonEnum(String name)
    {
        this.name = name;
    }

    
public String getName() { return name; } }
複製程式碼

    實際上在第一行寫列舉類例項的時候,預設是呼叫了構造器的,所以此處需要傳入引數,因為沒有顯式申明無參構造器,只能呼叫有引數的構造器。

  構造器需定義成私有的,這樣就不能在別處申明此類的物件了。列舉類通常應該設計成不可變類,它的Field不應該被改變,這樣會更安全,而且程式碼更加簡潔。所以我們將Field用private final修飾。

【3】Demo1 - 記錄狀態

public enum publishActionType {
	TO_ADD_PUBLISH(0),
	TO_MODIFY_PUBLISH(1)
	;
	
	private int code;

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}
	
	publishActionType(int code){
		this.code = code;
	}
	
}

【4】Demo2 -- 某型別

public enum WorldChannelType {

	SYSTEM(1, "系統"),
	CHAT(2, "聊天");
	
	private int code;
	private String name;
	
	private WorldChannelType(int code, String name){
		this.code = code;
		this.name = name;
	}

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	public String getName() {
		return name;
	}

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

【5】Demo3 -- 跳轉型別

public enum TurnUrlEnum {
	NONE(0,"無跳轉","None",1),
	GameWeb(1,"跳轉外部網頁連結","GameWeb",1),
	Mall_SKIN(2,"跳轉到商城購買面板","Mall",1),
	Mall_GOLD_COIN(3,"跳轉到商城購買金幣","Mall",1),
	Mall_DISMONDS(4,"跳轉到商城購買鑽石","Mall",1),
	Mall_PROP(5,"跳轉到商城購買道具","Mall",1),
	ACTIVITY_LAYER(6,"跳轉到活動頁面","ACTIVITY_LAYER",1),
	;

	private int urlTypeId;	//對應excel表的xmlId
	private String nameCh;	//名稱
	private String nameEng; //出售價格
	private int permission; //選擇許可(0:不許可;1:開放)
	
	public static TurnUrlEnum getEnum(int id){
		for(TurnUrlEnum e : TurnUrlEnum.values()){
			if(e.getUrlTypeId() == id) {
				return e;
			}
		}
		return NONE;
	}

	public int getUrlTypeId() {
		return urlTypeId;
	}


	public void setUrlTypeId(int urlTypeId) {
		this.urlTypeId = urlTypeId;
	}


	public String getNameCh() {
		return nameCh;
	}


	public void setNameCh(String nameCh) {
		this.nameCh = nameCh;
	}


	public String getNameEng() {
		return nameEng;
	}


	public void setNameEng(String nameEng) {
		this.nameEng = nameEng;
	}

	public int getPermission() {
		return permission;
	}

	public void setPermission(int permission) {
		this.permission = permission;
	}

	private TurnUrlEnum(int urlTypeId, String nameCh, String nameEng,
			int permission) {
		this.urlTypeId = urlTypeId;
		this.nameCh = nameCh;
		this.nameEng = nameEng;
		this.permission = permission;
	}

}

以上是對列舉類的一個小結。