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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java java.lang.enum_源码阅读-java基础-java.lang.Enum

發布時間:2025/3/8 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java java.lang.enum_源码阅读-java基础-java.lang.Enum 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、引言

枚舉類型是 JDK 5 之后引進的一種非常重要的引用類型,可以用來定義一系列枚舉常量。相比與常量(public static final定義),在安全性、指意性、可讀性方面更勝一籌。另外它可以和switch case搭配使用。

2、類定義

實際上在使用關鍵字enum創建枚舉類型并編譯后,編譯器會為我們生成一個相關的類,這個類繼承了Java API中的java.lang.Enum類,也就是說通過關鍵字enum創建枚舉類型在編譯后事實上也是一個類類型而且該類繼承自java.lang.Enum類,并且該類類型是final修飾的,無法被繼承。

public abstract class Enum>implements Comparable, Serializable {}

3、成員屬性

// 枚舉常量的名稱

private final String name;

// 它和不重寫的toString()方法返回的是一樣的,只不過toString()方法可以進行重寫定制。

public final String name() {

return name;

}

/**

* 枚舉常量的序號(它在枚舉聲明中的位置,其中初始常量的序號為零)。

* 代碼中盡量避免使用該值,因為我們有時候添加新枚舉時,總是“按組”放在一起,不會放到最后,除非強制要求。

* 比如接口響應碼的枚舉,我們通常會把參數異常的放一組,內部異常的放一組等。如果參數異常新添加一個枚舉“xx不存在”,如果這個枚舉沒有放在整個接口響應碼枚舉的末尾,而是放到了某一組的末尾,那么部分枚舉常量的ordinal值就發生了變化。這將是災難性的,所以要么代碼規范添加新枚舉只能添加到末尾;要么不使用該值。

*/

private final int ordinal;

public final int ordinal() {

return ordinal;

}

4、構造方法

// 唯一的構造方法,程序員調用不到,它由編譯器發出的代碼用于響應枚舉類型聲明。

protected Enum(String name, int ordinal) {

this.name = name;

this.ordinal = ordinal;

}

5、其他方法

// 返回聲明中包含的此枚舉常量的名稱。 可以覆蓋該方法,但通常不需要或不需要。

public String toString() {

return name;

}

public final boolean equals(Object other) {

return this==other;

}

// 這里調用的是Object的hashCode方法

public final int hashCode() {

return super.hashCode();

}

// 不能克隆,保證了枚舉永遠是單例的,所以枚舉是單例模式的典型代表

protected final Object clone() throws CloneNotSupportedException {

throw new CloneNotSupportedException();

}

// 這里需要注意,底層的實現用的是ordinal實現的,即比較的是枚舉常量的序號。

public final int compareTo(E o) {

Enum> other = (Enum>)o;

Enum self = this;

if (self.getClass() != other.getClass() &&

self.getDeclaringClass() != other.getDeclaringClass())

throw new ClassCastException();

return self.ordinal - other.ordinal;

}

// 返回與此枚舉常量的枚舉類型相對應的 Class 對象。

public final Class getDeclaringClass() {

Class> clazz = getClass();

Class> zuper = clazz.getSuperclass();

return (zuper == Enum.class) ? (Class)clazz : (Class)zuper;

}

// 枚舉不能有finalize方法

protected final void finalize() { }

/**

* 防止默認反序列化

*/

private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException {

throw new InvalidObjectException("can't deserialize enum");

}

private void readObjectNoData() throws ObjectStreamException {

throw new InvalidObjectException("can't deserialize enum");

}

/**

* 返回簡單名稱到枚舉常量的映射。

* name的值必須與用于聲明此類型的枚舉常量的標識符完全一致。

*

* 對于特定的枚舉類型T,有兩個隱式聲明的方法可以直接使用:

* 1) public static T valueOf(String) 根據名稱獲取單個枚舉類型;這個我深有體會,因為之前是不知道有這個方法,通常是用values()獲取枚舉集合map,然后遍歷

* 2) public static T[] values() 獲取所有枚舉類型數組;

*/

public static > T valueOf(Class enumType,String name) {

T result = enumType.enumConstantDirectory().get(name);

if (result != null)

return result;

if (name == null)

throw new NullPointerException("Name is null");

throw new IllegalArgumentException(

"No enum constant " + enumType.getCanonicalName() + "." + name);

}

/**

* 1)該方法是屬于java.lang.Class,不是java.lang.Enum的方法;

* 2)enumConstantDirectory 是一個map,定義如下:private volatile transient Map enumConstantDirectory = null;其中key為枚舉的name,value為枚舉。

* 3)enumConstantDirectory()方法獲取枚舉常量目錄,沒有就繼續調用getEnumConstantsShared();如果有返回值,就遍歷put進enumConstantDirectory。

*/

Map enumConstantDirectory() {

if (enumConstantDirectory == null) {

T[] universe = getEnumConstantsShared();

if (universe == null)

throw new IllegalArgumentException(

getName() + " is not an enum type");

Map m = new HashMap<>(2 * universe.length);

for (T constant : universe)

m.put(((Enum>)constant).name(), constant);

enumConstantDirectory = m;

}

return enumConstantDirectory;

}

7、枚舉隱式實現的方法

如上所說,枚舉自動繼承這兩個隱式方法。這兩個方法很重要,所以我在這里單拎出來了。

// 根據名稱獲取單個枚舉類型

public static T valueOf(String){}

// 獲取所有枚舉類型數組

public static T[] values(){}

8、枚舉集合

這兩個是枚舉優化過后的集合,比HashSet,HashMap的性能更高。

8.1、EnumSet

8.2、EnumMap

總結

以上是生活随笔為你收集整理的java java.lang.enum_源码阅读-java基础-java.lang.Enum的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。