Java Enum 源码分析

所有的Java枚举类型都继承自该抽象类。我们用关键字enum来声明枚举类型,不可以通过显式继承该抽象类的方式来声明。


public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {

private final String name;

// 当前枚举常量名称
public final String name() {
return name;
}

private final int ordinal;

// 当前枚举常量次序,从0开始
public final int ordinal() {
return ordinal;
}

// 专有构造器,我们无法调用。该构造方法用于由响应枚举类型声明的编译器发出的代码。
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}

// 返回枚举常量的名称,默认是返回name值。可以重写该方法,输出更加友好的描述。
public String toString() {
return name;
}

// 比较当前枚举常量是否和指定的对象相等。因为枚举常量是单例的,所以直接调用==操作符。子类不可以重写该方法。
public final boolean equals(Object other) {
return this==other;
}

// 返回该枚举常量的哈希码。和equals一致,该方法不可以被重写。
public final int hashCode() {
return super.hashCode();
}

// 因为枚举常量是单例的,所以不允许克隆。
protected final Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}

// 比较该枚举常量和指定对象的大小。它们的类型要相同,根据它们在枚举声明中的先后顺序来返回大小(前面的小,后面的大)。子类不可以重写该方法
public final int compareTo(E o) {
Enum other = (Enum)o;
Enum self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}

// 得到枚举常量所属枚举类型的Class对象
public final Class<E> getDeclaringClass() {
Class clazz = getClass();
Class zuper = clazz.getSuperclass();
return (zuper == Enum.class) ? clazz : zuper;
}

// 返回带指定名称的指定枚举类型的枚举常量。名称必须与在此类型中声明枚举常量所用的标识符完全匹配。不允许使用额外的空白字符。
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 const " + enumType +"." + name);
}

// 不允许反序列化枚举对象
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");
}

// 枚举类不可以有finalize方法,子类不可以重写该方法
protected final void finalize() { }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值