JDK源碼Enum類(lèi)原理及代碼實(shí)例解析
正文
一 概述
枚舉類(lèi)型是 JDK 5 之后引進(jìn)的一種非常重要的引用類(lèi)型,可以用來(lái)定義一系列枚舉常量,使用 enum 來(lái)表示枚舉可以更好地保證程序的類(lèi)型安全和可讀性
實(shí)際上在使用關(guān)鍵字enum創(chuàng)建枚舉類(lèi)型并編譯后,編譯器會(huì)為我們生成一個(gè)相關(guān)的類(lèi),這個(gè)類(lèi)繼承了Java API中的java.lang.Enum類(lèi),
也就是說(shuō)通過(guò)關(guān)鍵字enum創(chuàng)建枚舉類(lèi)型在編譯后事實(shí)上也是一個(gè)類(lèi)類(lèi)型而且該類(lèi)繼承自java.lang.Enum類(lèi)
使用舉例
public class EnumTest {
enum MyCode{
ONE("1","編碼一"),
TWO("2","編碼二");
private String code;
private String name;
MyCode(String code, String name) {
this.code = code;
this.name = name;
}
}
public static void main(String[] args) {
// 獲取一個(gè)枚舉實(shí)例
MyCode one = MyCode.valueOf(MyCode.class, "ONE");
// 可以調(diào)用Enum類(lèi)中的實(shí)例方法
one.compareTo(MyCode.TWO);
}
}
二 源碼分析
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
//枚舉常量的名稱(chēng)
private final String name;
//返回此枚舉常量的名稱(chēng),與其枚舉聲明中聲明的完全相同
public final String name() {
return name;
}
//此枚舉常量的序數(shù)(它在枚舉聲明中的位置,其中初始常量的序數(shù)為零)
private final int ordinal;
//返回序號(hào)
public final int ordinal() {
return ordinal;
}
// 構(gòu)造器
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
//返回聲明中包含的此枚舉常量的名稱(chēng)
public String toString() {
return name;
}
//果指定的對(duì)象等于此枚舉常量,則返回true。
public final boolean equals(Object other) {
return this==other;
}
public final int hashCode() {
return super.hashCode();
}
// 無(wú)法被克隆
protected final Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
//將此枚舉與指定的枚舉序號(hào)進(jìn)行比較
public final int compareTo(E o) {
Enum<?> other = (Enum<?>)o;
Enum<E> self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
//返回與此枚舉常量的枚舉類(lèi)型相對(duì)應(yīng)的Class對(duì)象
@SuppressWarnings("unchecked")
public final Class<E> getDeclaringClass() {
Class<?> clazz = getClass();
Class<?> zuper = clazz.getSuperclass();
return (zuper == java.lang.Enum.class) ? (Class<E>)clazz : (Class<E>)zuper;
}
/**
* 返回具有指定名稱(chēng)的指定枚舉類(lèi)型的枚舉常量。
* 該名稱(chēng)必須與用于聲明此類(lèi)型的枚舉常量的標(biāo)識(shí)符完全一致。
* 請(qǐng)注意,對(duì)于特定枚舉類(lèi)型T ,
* 有兩個(gè)隱式聲明方法可以直接使用:
* public static T valueOf(String) 根據(jù)名稱(chēng)獲取單個(gè)枚舉類(lèi)型
* public static T[] values() 獲取所有枚舉類(lèi)型數(shù)組
*/
public static <T extends Enum<T>> T valueOf(Class<T> 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);
}
//枚舉類(lèi)不能有 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");
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Docker 解決openjdk容器里無(wú)法使用JDK的jmap等命令問(wèn)題
- java的jdk基礎(chǔ)知識(shí)點(diǎn)總結(jié)
- jdk15的安裝與配置全過(guò)程記錄
- Java jdk安裝及javac命令無(wú)效解決方案
- Ubuntu安裝jdk8常用方法流程解析
- 安裝多個(gè)jdk導(dǎo)致eclipse打不開(kāi)問(wèn)題解決方案
- appium+python自動(dòng)化配置(adk、jdk、node.js)
- 詳解關(guān)于eclipse中使用jdk15對(duì)應(yīng)javafx15的配置問(wèn)題總結(jié)
- 淺談JDK14性能管理工具之jmap和jhat
相關(guān)文章
java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例
在項(xiàng)目開(kāi)發(fā)中經(jīng)常用到,比如前端上送文件流(byte[])到后臺(tái)并轉(zhuǎn)成文件,本文主要介紹了java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
Java中的 BigDecimal 和 String 的相互轉(zhuǎn)換問(wèn)題
這篇文章主要介紹了Java中的 BigDecimal 和 String 的相互轉(zhuǎn)換問(wèn)題,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Java環(huán)境中MyBatis與Spring或Spring MVC框架的集成方法
和MyBatis類(lèi)似,Spring或者Spring MVC框架在Web應(yīng)用程序的運(yùn)作中同樣主要負(fù)責(zé)處理數(shù)據(jù)庫(kù)事務(wù),這里我們就來(lái)看一下Java環(huán)境中MyBatis與Spring或Spring MVC框架的集成方法2016-06-06
Java定時(shí)器例子_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本文給大家分享了java定時(shí)器例子,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-05-05
Java基礎(chǔ)之打印萬(wàn)年歷的簡(jiǎn)單實(shí)現(xiàn)(案例)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)之打印萬(wàn)年歷的簡(jiǎn)單實(shí)現(xiàn)(案例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07
OKHttp3(支持Retrofit)的網(wǎng)絡(luò)數(shù)據(jù)緩存Interceptor攔截器的實(shí)現(xiàn)
本篇文章主要介紹了OKHttp3(支持Retrofit)的網(wǎng)絡(luò)數(shù)據(jù)緩存Interceptor攔截器的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Spring Boot 深入分析AutoConfigurationImportFilter自動(dòng)化條件
這篇文章主要分析了Spring Boot AutoConfigurationImportFilter自動(dòng)化條件配置源碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-07-07
Spring如何基于xml實(shí)現(xiàn)聲明式事務(wù)控制
這篇文章主要介紹了Spring如何基于xml實(shí)現(xiàn)聲明式事務(wù)控制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10

