日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java enum优点_你需要关注的 Java Enum 枚举的几个细节

發(fā)布時間:2023/12/4 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java enum优点_你需要关注的 Java Enum 枚举的几个细节 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

枚舉是一個非常古老的語言特性,用來實現(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。