Enum
Java的枚举定义通过关键字Enum表示。Enum定义类似如下:
package com.mcg.demo;
public enum EnumDemo {
Demo1("demo1"),Demo2("demo2"),Demo3("demo3");
private String name;
EnumDemo(String name) {
this.name=name;
}
}
当我们使用EnumDemo类时,发现EnumDemo类默认给我们提供了values、valueOf方法
EnumDemo.values();
EnumDemo.valueOf("demo1");
EnumDemo.valueOf(EnumDemo.class, "demo1");
所以应该是编译器在编译源代码的时候,进行了特殊处理。需要分析编译后产生的class文件,
public final class com.mcg.demo.EnumDemo extends java.lang.Enum <com.mcg.demo.EnumDemo> {
public static final com.mcg.demo.EnumDemo Demo1;
public static final com.mcg.demo.EnumDemo Demo2;
public static final com.mcg.demo.EnumDemo Demo3;
static {Demo1 = new com.mcg.demo.EnumDemo("Demo1",0);
Demo2 = new com.mcg.demo.EnumDemo("Demo2",1);
Demo3 = new com.mcg.demo.EnumDemo("Demo3",2);
$VALUES = (new com.mcg.demo.EnumDemo[] { Demo1, Demo2, Demo3 });}
private static final com.mcg.demo.EnumDemo $VALUES[];
private com.mcg.demo.EnumDemo(String s,int i) { super(s, i);}
public static com.mcg.demo.EnumDemo[] values() { return (com.mcg.demo.EnumDemo[])$VALUES.clone(); }
public static com.mcg.demo.EnumDemo valueOf(String name){ ... }
}
短短的几行代码,被编译器处理过之后竟然变得这么多,看来,enmu关键字是java提供给我们的一个语法糖,我们发现,编译器帮我们在编译后默认继承java.lang.Enum类,而不像其他的类一样默认继承Object类。且采用enum声明后,该类会被编译器加上final声明,故该类是无法继承的。Enum是java.lang包中的一个类,Enum类在JDK中是这样描述:(This is the common base class of all Java language enumeration types)Java语言中所有枚举类型的公共基类。
public abstract class Enum <E extends Enum<E>>implements Comparable<E>, Serializable
Enum类是一个抽象类,Enum实现了Serializable接口,可以序列化。 Enum实现了Comparable接口,可以进行比较,默认情况下,只有同类型的enum才进行比较(原因见后文),要实现不同类型的enum之间的比较,只能复写compareTo方法。
构造函数
Enum是一个抽象类,不能被实例化,但是他有构造函数,从前面我们反编译出来的代码中,我们也发现了Enum的构造函数,在Enum中只有一个保护类型的构造函数:
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;//代表顺序,从0开始;
}
其他方法
public String toString() {
return name;
}
public final boolean equals(Object other) {
return this==other;
}
public final int hashCode() {
return super.hashCode();
}
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;
}
public final Class<E>
getDeclaringClass() {
Class clazz = getClass();
Class zuper = clazz.getSuperclass();
return (zuper == Enum.class) ? clazz : zuper;
}
//valueOf(String name)调用该方法
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);
}