java enum优点_你需要关注的 Java Enum 枚举的几个细节
枚舉是一個非常古老的語言特性,用來實現(xiàn)具名的有限集合,在 C/C++ 中使用廣泛。而 Java 在 Java SE5 才引入枚舉。也許語言設計者覺得既然是后引入該特性,那么一定要在這個特性上支持比其他語言更多的特性。這些特性的確讓 Java 的枚舉功能看起來更加“成熟”,同時也引入了一些復雜性,需要開發(fā)者關注。
枚舉是一個不能繼承的常規(guī)類
定義一個一周七天的枚舉類型:
public enum EnumWeekDay {
Mon, Tue, Wed, Thu, Fri, Sat, Sun;
}
編譯成 class 文件后反編譯查看:
╰─? javap EnumWeekDay
Compiled from "EnumWeekDay.java"
public final class EnumWeekDay extends java.lang.Enum {
public static final EnumWeekDay Mon;
public static final EnumWeekDay Tue;
public static final EnumWeekDay Wed;
public static final EnumWeekDay Thu;
public static final EnumWeekDay Fri;
public static final EnumWeekDay Sat;
public static final EnumWeekDay Sun;
public static EnumWeekDay[] values();
public static EnumWeekDay valueOf(java.lang.String);
static {};
}
從反編譯結果可知:枚舉類型的關鍵字 enum 其實只是一個語法糖,編譯器最終把它轉(zhuǎn)化為一個final類,因此枚舉是不可繼承的。
枚舉的每一個取值被編譯器傳化為了一個個 static final 屬性。
本質(zhì)上,這就是一個普通類,因此你可以在枚舉是添加各種方法,甚至是main方法。
神奇的 values() 方法
從上面我們可以看出枚舉類型被添加了一個靜態(tài)的 values() 方法,但是 java.lang.Enum 并沒有該方法。其實,這個方法是編譯器添加的。通過這個方法可以獲取到該枚舉類型的所有取值。這個方法在需要遍歷枚舉取值,進行判斷篩選的場景非常有用,可參考下例的 getByZhName 方法。
在枚舉中保存其他信息
在 C 中,枚舉可以簡單的理解為具名的整型子集。Java 擴展了這個屬性,使得可以在枚舉中保存其他信息。
定義一個水果枚舉類,并包含中文信息:
public enum EnumFruit {
APPLE("蘋果"),
BANANA("香蕉"),
ORANGE("橘子");
private String zhName;
EnumFruit(String zhName) {
System.out.println("enum init:" + zhName);
this.zhName = zhName;
}
/**
* Getter method for property zhName.
*
* @return property value of zhName
*/
public String getZhName() {
return zhName;
}
public EnumFruit getByZhName(String zhName) {
for (EnumFruit fruit : values()) {
if (fruit.getZhName().equals(zhName)) {
return fruit;
}
}
return null;
}
}
使用這種方式定義枚舉的方式需要注意:該枚舉必須含有一個構造函數(shù),且該構造函數(shù)必須是私有的。因為枚舉就是常規(guī)類,而枚舉對象就是具體的枚舉實例,因此枚舉有多少個取值,該構造函數(shù)就會被調(diào)用多少次:
public class EnumUser {
public static void main(String[] args) {
EnumFruit fruit = EnumFruit.APPLE;
System.out.println(fruit);
}
}
enum init:蘋果
enum init:香蕉
enum init:橘子
APPLE
使用 EnumSet 和 EnumMap 提供性能
如果要在把枚舉使用在 Set、Map 等集合場景,請使用 EnumSet 和 EnumMap。 EnumSet 使用了 bit vector 來標記元素,EnumMap 內(nèi)部將 Map 實現(xiàn)簡化為了數(shù)組,因此可以獲得更好的性能。
小結
Java 的枚舉語言特性作為一個后來者,的確帶來了更加“成熟”和“豐富”的實現(xiàn)。但是,這些豐富的特性是否一定要在日常的項目中使用,我個人是不推薦的。就我個人理解,枚舉最大的優(yōu)點是類型和有限集合的約束,從而增強代碼的一致性。因此,我提倡在項目代碼中用 C 的枚舉風格來使用 Java 枚舉。此外,枚舉并不是編程語言必須支持的特性,比如近段時間如日中天的 Golang 是不支持枚舉的。既然是一個可有可無的語言特性,那就 use is as simple as possible 吧。
擴展閱讀
總結
以上是生活随笔為你收集整理的java enum优点_你需要关注的 Java Enum 枚举的几个细节的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hadoop安装hive及配置mysql
- 下一篇: Java标签移动_如何使用基于鼠标单击的