欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JDK源碼Enum類原理及代碼實(shí)例解析

 更新時間:2020年11月16日 10:36:07   作者:侯賽雷  
這篇文章主要介紹了JDK源碼Enum類原理及代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

正文

一 概述

枚舉類型是 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)文章

最新評論