java枚舉如何運用?
謝謝邀請,下面介紹一下枚舉的用法
認識枚舉
枚舉就是要讓某個類型的變量的取值只能為若干個固定值中的一個,否則編譯器就會報錯,枚舉可以讓編譯器在編譯時就可以控制源程序賦給的非法值,使用普通變量的方式在開發階段無法實現這一目標.
在JDK1.5之后,使用關鍵字enum定義一種新的類型,稱為枚舉類型。
JDK 1.5 中可以在 switch 表達式中使用Enum定義的枚舉類的對象作為表達式, case 子句可以直接使用枚舉值的名字, 無需添加枚舉類作為限定
枚舉的定義
枚舉的類名建議帶上Enum后綴,枚舉成員需要全大寫,單詞間用下劃線隔開。
枚舉其實是特殊的常量類,且構造方法被默認的強制私有。
正確的命名方式為:
ResultEnum的成員名稱為: SUCCESS / UNKNOWN_REASON。
定義規則如下:
私有化類的構造器。
成員變量如果聲明為final。要在構造器中初始化,不允許被修改、
通過公共方法 調用屬性。
枚舉實例必須在前面
需要在枚舉實例后面加上分號,然后再寫構造函數等。
枚舉類默認提供了values()方法,該方法可以很方便得遍歷所有的枚舉值
枚舉類對象可以有屬性
若枚舉類顯式的定義了帶參數的構造器, 則在列出枚舉值時也必須對應的傳入參數
Enum類 與 enum關鍵字
使用enum 關鍵字定義的枚舉類,實際上就想當于定義了一個類,此類繼承了Enum類而已
集合對枚舉的支持集合對枚舉的支持,對于Set和Map接口而言又增加了兩個新的子類: EnumSet 、EnumMap兩個類:
enum 類基本用法
我們可以定義一個顏色的枚舉:
怎么調用呢,Java switch語句參數就支持enum類
帶構造方法的枚舉
定義規則:
私有化類的構造器
枚舉實例必須在前面
需要在枚舉實例后面加上分號,然后再寫構造函數等
讓枚舉實現接口
枚舉類可以實現一個或多個接口。與普通類實現接口完全一樣,枚舉類實現接口時,需要實現該接口所包含的方法。
如果需要每個枚舉值在調用同一個方法時呈現不同的行為,則可以讓每個枚舉值在{...}匿名塊中實現自己的業務邏輯
在枚舉中定義抽象方法
enum類是很特殊的一個類,實際上它是一個抽象類。枚舉中可以用抽象方法,但是枚舉中的每一個對象都分別實現抽象方法;
枚舉實現單例類
1、借助JDK1.5添加的枚舉來實現單例模式。不僅能夠避免多線程同步問題,而且還能防止反序列化重新創建新的對象.
2、這種方式是Effective Java 作者 Josh Bloch 提倡的方式
enum類和常量的區別
這種方式在使用上跟枚舉沒有卻別,但是我們為什么選擇枚舉呢?
(1) 、類型不安全: 因為上面的每個顏色實際上時一個int 整數,因此完全可以把一個顏色當成一個int整數使用,例如進行加法運算RED+ GREEN,這樣代碼完全正常
(2) 、 沒有命名空間: 當需要使用顏色時,必須在前面加上COLOR_前綴,否則程序可能與其他類中的靜態常量混淆
。(3) 、 打印輸出的意義不明確:當輸出某個季節時,例如輸出COLOR_RED,實際 上輸出的是1,這個1很難猜測它代表了紅色.
(4) 不容易擴展,每一個key對應一個值,
枚舉類與普通類區別
使用 enum 定義的枚舉類默認繼承了 java.lang.Enum 類
枚舉類的構造器只能使用 private 訪問控制符枚舉類的所有實例必須在枚舉類中顯式列出(, 分隔 ; 結尾). 列出的實例系統會自動添加 public static final 修飾Enum枚舉類主要方法
values()方法:返回枚舉類型的對象數組。該方法可以很方便地遍歷所有的枚舉值。
valueOf(String str):可以把一個字符串轉為對應的枚舉類對象。要求字符串必須是枚舉類對象的“名字”。如不是,會有運行時異常。