JDK1.8源码学习--lang包(Enum)

前言


月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂)

央是一片海洋,海乃百川,代表着一块海绵(吸纳万物)

泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出)

月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容

希望大家一起坚持这个过程,也同样希望大家最终都能从零到零,把知识从薄变厚,再由厚变薄!
 

一.Enum的作用:

        直接看源码注释(我的翻译可能不太准,如果道友们有更棒的理解,可以留言或者私信)

/**
 * This is the common base class of all Java language enumeration types.
 * 1.这是所有 Java 语言枚举类型的公共基类
 * More information about enums, including descriptions of the
 * implicitly declared methods synthesized by the compiler, can be
 * found in section 8.9 of
 * <cite>The Java&trade; Language Specification</cite>.
 * 2.有关枚举的更多信息,包括对编译器合成的隐式声明方法的描述,可以在Java语言规范的第 8.9 节中找到
 *
 * <p> Note that when using an enumeration type as the type of a set
 * or as the type of the keys in a map, specialized and efficient
 * {@linkplain java.util.EnumSet set} and {@linkplain
 * java.util.EnumMap map} implementations are available.
 * 3.请注意,当使用枚举类型作为集合的类型或映射中的键的类型时,
 * 专门且高效的 java.util.EnumSet和 java.util.EnumMap实现是可用的
 * @param <E> The enum type subclass
 * @author  Josh Bloch
 * @author  Neal Gafter
 * @see     Class#getEnumConstants()
 * @see     java.util.EnumSet
 * @see     java.util.EnumMap
 * @since   1.5
 */

二.Enum的类图:

 

           a).一个Comparable,这个接口对实现他的每个对象都可按照一定的规则来进行排序,详情请点击下面链接

               JDK1.8源码学习--lang包(Comparable)_w5_Silence的博客-CSDN博客

            b).Secializable,这个接口是可为实现的对象进行序列化,详情请点击下面链接
                  ......(假装这个是链接,以后补充)
 

三.成员变量:    

  /**
 
     * 此枚举常量的名称,在枚举声明中声明。大多数程序员应该使用 toString方法而不是访问这个字段
     */
    private final String name;

  /**
     * 1.此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零

     * 2.大多数程序员不会使用这个领域。它设计用于复杂的基于枚举的数据结构,
     * 例如 java.util.EnumSet和 java.util.EnumMap
     */
    private final int ordinal;

四.构造方法:    

 /**
     * 唯一的构造函数。程序员不能调用这个构造函数。它供编译器为响应枚举类型声明而发出的代码使用
     */
    protected Enum(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
    }

五.内部方法:  

                name

   /**
     * 返回此枚举常量的名称,与在其枚举声明中声明的完全相同
     * 大多数程序员应该优先使用 toString方法,
     * 因为 toString方法可能会返回一个更用户友好的名称。这种方法主要设计用于正确性取决于获得准确名称,不会因版本而异
     */
    public final String name() {
        return name;
    }

                ordinal


    /**
  
     * 1.返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量被分配零序数)

     *2.大多数程序员不会使用这种方法。它设计用于复杂的基于枚举的数据结构,

     */
    public final int ordinal() {
        return ordinal;
    }

                toString

   /**
     * 返回此枚举常量的名称,包含在声明中。此方法可能会被覆盖,尽管它通常不是必需的或不可取的。
     * 当存在更“程序员友好”的字符串形式时,枚举类型应覆盖此方法
     */
    public String toString() {
        return name;
    }

                equals

/
     * 如果指定的对象等于此枚举常量,则返回 true
=
     */
    public final boolean equals(Object other) {
        return this==other;
    }

                hashCode

/**
     * 返回此枚举常量的哈希码
     */
    public final int hashCode() {
        return super.hashCode();
    }

                clone

  /**
     * 抛出 CloneNotSupportedException。
     * 这保证了枚举永远不会被克隆,这是保持它们的“单例”状态所必需的
     */
    protected final Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException();
    }

                compareTo

   /**
     * 1.将此枚举与指定的对象进行比较以进行排序。当此对象小于、等于或大于指定对象时,返回负整数、零或正整数
     * 2.枚举常量只能与相同枚举类型的其他枚举常量进行比较。这个方法实现的自然顺序就是声明常量的顺序
     */
    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;
    }

                getDeclaringClass()

  /**
     * 1.返回与此枚举常量的枚举类型对应的 Class 对象
     * 2.两个枚举常量 e1 和 e2 是相同的枚举类型当且仅当 e1.getDeclaringClass() == e2.getDeclaringClass()
     * 3.(对于具有特定于常量的类主体的枚举常量,此方法返回的值可能与Object.getClass方法返回的值不同。
     */
    @SuppressWarnings("unchecked")
    public final Class<E> getDeclaringClass() {
        Class<?> clazz = getClass();
        Class<?> zuper = clazz.getSuperclass();
        return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper;
    }

                valueOf

  /**
     * 1.返回具有指定名称的指定枚举类型的枚举常量。该名称必须与用于在此类型中声明枚举常量的标识符完全匹配。 
     * (不允许使用多余的空白字符。)
     * 2.请注意,对于特定的枚举类型 T,可以使用该枚举上隐式声明的public static T valueOf(String)
     * 方法代替此方法来从名称映射到相应的枚举常量。枚举类型的所有常量都可以通过调用该类型的隐式 
     */
    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);
    }

六.总结: 

        枚举类用的不多,所以简单了解一下好了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值