Enum源码分析。

/**
 * 请注意,当使用枚举类型作为集合或者映射的键的类型时,可以使用EnumSet和EnumMap更高效。
 *
 */
public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable {
	/*
	 * 实现Comparable接口,实现compareTo方法,用于比较.<br />
	 * 实现Serializable接口,用于序列化
	 */
	// 此枚举常量的名称,如枚举声明中声明的那样,建议使用toString()方法。
    private final String name;
	/**
	 * 返回此枚举常量的名称,在其枚举声明中对其进行声明。 
	 * 与此方法相比,大多数程序员应该优先考虑使用 toString() 方法,
	 * 因为 toString 方法返回更加用户友好的名称。该方法主要设计用于特殊情形,
	 * 其正确性取决于获取正确的名称,其名称不会随版本的改变而改变。
	 * @return
	 */
	public fin
    public final String name() {
        return name;
    }
	/*
	 * 这个枚举常数的序号(它的位置)在enum声明中,其中分配了初始常数(0的序数)。
	 * 大多数程序员不会使用此方法。
	 * 它设计用于复杂的基于枚举的数据结构,例如java.util.EnumSet和java.util.EnumMap。
	 */
    private final int ordinal;
	/**
	 * 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。 
	 * 大多数程序员不会使用此方法。
	 * 它被设计用于复杂的基于枚举的数据结构,比如 EnumSet 和 EnumMap。 
	 * @return
	 */
    public final int ordinal() {
        return ordinal;
    }
    /**
     * 构造方法。
     * 此方法可能会被重写,但通常是这样没有必要。
     * 枚举类型应该覆盖这个方法,当存在更“程序员友好”的字符串形式时使用。
     * @param name	此枚举常量的名称,它是用来声明该常量的标识符。
     * @param ordinal	枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
     */
    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();
    }
    /**
     * 抛出 CloneNotSupportedException。
     * 这可保证永远不会复制枚举,这对于保留其“单例”状态是必需的。
     * 所以,枚举类型就是单例模式的经典代表。 
     */
    protected final Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException();
    }
    /**
     * 比较此枚举与指定对象的顺序。
     */
    public final int compareTo(E o) {
        Enum<?> other = (Enum<?>)o;
        Enum<E> self = this;
        // 判断当前枚举和指定的枚举的运行时类是否一致
        // 判断当前枚举和指定的枚举的类型相对应的Class对象是否一致
        if (self.getClass() != other.getClass() && // 优化
            self.getDeclaringClass() != other.getDeclaringClass())
            throw new ClassCastException();
        return self.ordinal - other.ordinal;
    }
	/**
	 * 返回与此枚举常量的枚举类型相对应的 Class 对象。
	 * @return
	 */
    @SuppressWarnings("unchecked")
    public final Class<E> getDeclaringClass() {
        Class<?> clazz = getClass();
        // 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
        Class<?> zuper = clazz.getSuperclass();
        return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper;
    }
    /***
     * 返回带指定名称的指定枚举类型的枚举常量。
     * 名称必须与在此类型中声明枚举常量所用的标识符完全匹配。(不允许使用额外的空白字符。) 
     * 请注意,对于一個特定枚举类型T ,
     * 可以使用该枚举上隐式声明的public static T valueOf(String)方法,
     * 而不是此方法将名称映射到相应的枚举常量。 
     * 所有的枚举类型的常量可以通过调用该类型的隐式{@code public static T[] values()}方法。
     * @param enumType	要从中返回常量的枚举类型的 Class 对象
     * @param name	要返回的常量名称 
     * @return
     */
    public static <T extends Enum<T>> T valueOf(Class<T> enumType,
                                                String name) {
    	// 返回从简单名称到枚举常量的映射。
    	// 注意,这个方法返回的映射是第一次使用时创建的。通常它不会被创建.
    	// 是一個HashMap。
        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() { }
    /**
     * 防止违约反序列化
     * @param in
     * @throws IOException
     * @throws ClassNotFoundException
     */
    private void readObject(ObjectInputStream in) throws IOException,
        ClassNotFoundException {
        throw new InvalidObjectException("can't deserialize enum");
    }
    /**
     * 不能反序列化枚举
     * @throws ObjectStreamException
     */
    private void readObjectNoData() throws ObjectStreamException {
        throw new InvalidObjectException("can't deserialize enum");
    }
}

参考:JDK1.6  API

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软件求生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值