JDK源碼Enum類原理及代碼實(shí)例解析
正文
一 概述
枚舉類型是 JDK 5 之后引進(jìn)的一種非常重要的引用類型,可以用來定義一系列枚舉常量,使用 enum 來表示枚舉可以更好地保證程序的類型安全和可讀性
實(shí)際上在使用關(guān)鍵字enum創(chuàng)建枚舉類型并編譯后,編譯器會(huì)為我們生成一個(gè)相關(guān)的類,這個(gè)類繼承了Java API中的java.lang.Enum類,
也就是說通過關(guān)鍵字enum創(chuàng)建枚舉類型在編譯后事實(shí)上也是一個(gè)類類型而且該類繼承自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) {
// 獲取一個(gè)枚舉實(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;
//返回序號(hào)
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;
}
//果指定的對(duì)象等于此枚舉常量,則返回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();
}
//將此枚舉與指定的枚舉序號(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;
}
//返回與此枚舉常量的枚舉類型相對(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;
}
/**
* 返回具有指定名稱的指定枚舉類型的枚舉常量。
* 該名稱必須與用于聲明此類型的枚舉常量的標(biāo)識(shí)符完全一致。
* 請(qǐng)注意,對(duì)于特定枚舉類型T ,
* 有兩個(gè)隱式聲明方法可以直接使用:
* public static T valueOf(String) 根據(jù)名稱獲取單個(gè)枚舉類型
* 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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java 如何從spring容器中獲取注入的bean對(duì)象
這篇文章主要介紹了Java 如何從spring容器中獲取注入的bean對(duì)象,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11
Springboot中靜態(tài)文件的兩種引入方式總結(jié)
這篇文章主要介紹了Springboot中靜態(tài)文件的兩種引入方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
springboot+websocket+redis搭建的實(shí)現(xiàn)
這篇文章主要介紹了springboot+websocket+redis搭建的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
多線程計(jì)數(shù),怎么保持計(jì)數(shù)準(zhǔn)確的方法
這篇文章主要介紹了多線程計(jì)數(shù)的方法,有需要的朋友可以參考一下2014-01-01
Struts 2 數(shù)據(jù)校驗(yàn)功能及校驗(yàn)問題的解決方案
這篇文章主要介紹了Struts 2 數(shù)據(jù)校驗(yàn)功能及校驗(yàn)問題的解決方案的相關(guān)資料,需要的朋友可以參考下2016-09-09
Springboot過濾器禁止ip頻繁訪問功能實(shí)現(xiàn)
這篇文章主要介紹了Springboot過濾器禁止ip頻繁訪問功能實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04

