JDK源碼Enum類原理及代碼實例解析
正文
一 概述
枚舉類型是 JDK 5 之后引進(jìn)的一種非常重要的引用類型,可以用來定義一系列枚舉常量,使用 enum 來表示枚舉可以更好地保證程序的類型安全和可讀性
實際上在使用關(guān)鍵字enum創(chuàng)建枚舉類型并編譯后,編譯器會為我們生成一個相關(guān)的類,這個類繼承了Java API中的java.lang.Enum類,
也就是說通過關(guān)鍵字enum創(chuàng)建枚舉類型在編譯后事實上也是一個類類型而且該類繼承自java.lang.Enum類
使用舉例
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) {
// 獲取一個枚舉實例
MyCode one = MyCode.valueOf(MyCode.class, "ONE");
// 可以調(diào)用Enum類中的實例方法
one.compareTo(MyCode.TWO);
}
}
二 源碼分析
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
//枚舉常量的名稱
private final String name;
//返回此枚舉常量的名稱,與其枚舉聲明中聲明的完全相同
public final String name() {
return name;
}
//此枚舉常量的序數(shù)(它在枚舉聲明中的位置,其中初始常量的序數(shù)為零)
private final int ordinal;
//返回序號
public final int ordinal() {
return ordinal;
}
// 構(gòu)造器
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
//返回聲明中包含的此枚舉常量的名稱
public String toString() {
return name;
}
//果指定的對象等于此枚舉常量,則返回true。
public final boolean equals(Object other) {
return this==other;
}
public final int hashCode() {
return super.hashCode();
}
// 無法被克隆
protected final Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
//將此枚舉與指定的枚舉序號進(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;
}
//返回與此枚舉常量的枚舉類型相對應(yīng)的Class對象
@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;
}
/**
* 返回具有指定名稱的指定枚舉類型的枚舉常量。
* 該名稱必須與用于聲明此類型的枚舉常量的標(biāo)識符完全一致。
* 請注意,對于特定枚舉類型T ,
* 有兩個隱式聲明方法可以直接使用:
* public static T valueOf(String) 根據(jù)名稱獲取單個枚舉類型
* public static T[] values() 獲取所有枚舉類型數(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);
}
//枚舉類不能有 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");
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot中靜態(tài)文件的兩種引入方式總結(jié)
這篇文章主要介紹了Springboot中靜態(tài)文件的兩種引入方式總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
springboot+websocket+redis搭建的實現(xiàn)
這篇文章主要介紹了springboot+websocket+redis搭建的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
多線程計數(shù),怎么保持計數(shù)準(zhǔn)確的方法
這篇文章主要介紹了多線程計數(shù)的方法,有需要的朋友可以參考一下2014-01-01
Struts 2 數(shù)據(jù)校驗功能及校驗問題的解決方案
這篇文章主要介紹了Struts 2 數(shù)據(jù)校驗功能及校驗問題的解決方案的相關(guān)資料,需要的朋友可以參考下2016-09-09
Springboot過濾器禁止ip頻繁訪問功能實現(xiàn)
這篇文章主要介紹了Springboot過濾器禁止ip頻繁訪問功能實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04

