JDK源碼Enum類原理及代碼實(shí)例解析
正文
一 概述
枚舉類型是 JDK 5 之后引進(jìn)的一種非常重要的引用類型,可以用來定義一系列枚舉常量,使用 enum 來表示枚舉可以更好地保證程序的類型安全和可讀性
實(shí)際上在使用關(guān)鍵字enum創(chuàng)建枚舉類型并編譯后,編譯器會為我們生成一個相關(guān)的類,這個類繼承了Java API中的java.lang.Enum類,
也就是說通過關(guān)鍵字enum創(chuàng)建枚舉類型在編譯后事實(shí)上也是一個類類型而且該類繼承自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) { // 獲取一個枚舉實(shí)例 MyCode one = MyCode.valueOf(MyCode.class, "ONE"); // 可以調(diào)用Enum類中的實(shí)例方法 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-03springboot+websocket+redis搭建的實(shí)現(xiàn)
這篇文章主要介紹了springboot+websocket+redis搭建的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04多線程計數(shù),怎么保持計數(shù)準(zhǔn)確的方法
這篇文章主要介紹了多線程計數(shù)的方法,有需要的朋友可以參考一下2014-01-01Struts 2 數(shù)據(jù)校驗(yàn)功能及校驗(yàn)問題的解決方案
這篇文章主要介紹了Struts 2 數(shù)據(jù)校驗(yàn)功能及校驗(yàn)問題的解決方案的相關(guān)資料,需要的朋友可以參考下2016-09-09Springboot過濾器禁止ip頻繁訪問功能實(shí)現(xiàn)
這篇文章主要介紹了Springboot過濾器禁止ip頻繁訪問功能實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04