淺談Java中的Enum類型
前言
由于之前在學習、開發過程中,基本沒怎么使用Enum類型,前幾天在學習單例設計模式的時候,碰到用Enum實現單例的一種方式,但是學得比較糾結,畢竟對Enum不太理解,今晚乘著放假有空,順便把Enum的原理粗略理解了一下,筆記整理如下
Enum的作用及實現方式
Enum類型是Java5中引進的新的一種類型,字面意思的理解是枚舉類型,主要用于聲明一些狀態或者固定不變的內容等的操作,具體內容如下所示
-
在沒有Enum類型之前,定義一些狀態主要是通過接口或者類來實現,如下代碼所示:
// 類定義性別的兩個狀態,分別是MAN和WOMAN
class Sex{
public static final String MAN = "MAN";
public static final String WEMAN = "WOMAN";} // 接口定義性別的兩個狀態,分別是MAN和WOMAN interface Sex{ String MAN = "MAN"; String WOMAN = "WOMAN"; }
-
上面的兩種方式是之前一直沿用的,這樣使用也沒有太大問題,就是不太直觀,引入Enum之后呢,如下所示
enum Sex{
MAN,WOMEN
}從上面代碼可以看到,用過Enum的這種定義方式,非常直觀,代碼維護起來也比較方便,而且,由于Enum類型本身的特性,由Enum類型定義出來的變量都是常量,而且由于具體實現方式的不同,Enum類型具有其他方式所沒有的安全性,比如其他方式可以通過發射進行操作,而Enum類型則不行等。
Enum的點滴
上面我們簡單地看到了Enum的實現方式,接下來,我們更進一步來了解Enum
Enum的本質
一開始接觸的時候,比較納悶的是為什么上面Enum的實現方式沒有問題,對應的字段是屬性還是值還是什么,不知道在看到這里的你有沒有這樣的疑惑,其實,上面所定義的MAN 以及WOMEN本質上是對象,Sex類型的對象,而Sex本身就是一個類,驗證如下:
public class TestEnums {
public static void main(String[] args) {
System.out.println(Sex.MAN.getClass());
System.out.println(Sex.class);
System.out.println(Sex.MAN instanceof Sex);
}
}
// 結果如下所示
// class cn.xuhuanfeng.learningenums.Sex
// class cn.xuhuanfeng.learningenums.Sex
// true
從上面的結果可以看出,枚舉類型所定義的內容實際上是該枚舉類型的對象,也就是說上面定義的MAN、WOMAN是Sex實例的兩個對象,只不過這兩個對象比較奇特,它們的初始化方式是在類內容實現,也就是說,在Enum類型中聲明的對象的是類的靜態實例常量。
Enum功能的擴展
既然Enum定義的類型本質上是類,那么按照定義類的方式,我們就可以為其添加字段,用于表示狀態;增加構造方法,用于初始化其值;增加普通方法,用于增強其功能,如下所示:
enum Sex{
/**
* 注意這里,下面的方式相當于
* Sex MAN = new Sex(1);
* Sex WOMEN = new Sex(2);
*/
MAN(1),WOMEN(2);
// 增加一個字段,表示其值
private int value;
// 構造方法必須私有化,保證不被外部所創建對象
private Sex(int value){
this.value = value;
}
// 訪問對應的值
public int getValue(){
return value;
}
}
對應的測試如下所示:
// 調用toString方法
System.out.println(Sex.MAN);
System.out.println(Sex.MAN.getValue());
// 對應的輸出結果如下所示
1_ MAN
1
上面的結果也更進一步說明了Enum類型本質上是類,事實上,我們所定義的Enum類型都默認繼承了java.lang.Enum 也就是說,我們定義的Enum類型雖然是類,但是不可以在繼承自其它類了,因為它已經繼承了java.lang.Enum 了。
Enum的其他說明
正如上面所提到了,Enum類型本質上是類,所以,定義一個類所可以做的事情,定義Enum類型的時候同樣可以,比如覆蓋方法,實現一個或者多個類,增加自己的方法等,在這里就不一一展開了(跟操作其他類的類是一致的)
總結
本節主要學習了Enum是什么、怎么使用以及使用Enum類型定義的方式與其他方式定義的不同。