Java基础:Enum的秘密方法values
1. 结论
Enum类并没有values()方法,是用关键字enum创建枚举类时,由编译器静态注入的。
用关键字enum创建枚举类默认继承自Enum
2. 探索
2.1 如下图显示了Enum类的方法和属性
2.2 下表简单介绍几个常用方法
函数 | 说明 | 其他 |
---|---|---|
public final int ordinal() | 返回enum声明中枚举常量的位置,从0开始计数 | 实例方法 |
public static <T extends Enum> T valueOf(Class enumType, String name) | 返回enum类中指定名称的枚举常量 | 静态方法 |
public static <T extends Enum> T[] values() | 返回enum类中定义的枚举常量数组 | 静态方法 |
2.3 实战演练
下面实例代码演示了enum关键字定义的枚举类被编译器注入values方法
public class test {
public static void main(String[] args) {
test2();
}
public static void test1(){
DbType dt=DbType.getDbType("sqlServer");
dt.ordinal();
DbType dbType=Enum.valueOf(DbType.class,"MYSQL");
System.out.println(dbType.name());
System.out.println(dt.getDesc()+","+dt.getKey());
}
public static void test2(){
analyze(TestEnum.class);
System.out.println("------------------------------");
analyze(Enum.class);
}
private static Set<String> analyze(Class<?> enumClazz){
Set<String> classMethodNameSet=new HashSet<>();
System.out.println("-------------开始分析------------------");
for (java.lang.reflect.Type t:enumClazz.getGenericInterfaces()) {
System.out.println(t.getTypeName());
}
System.out.println("父类 "+enumClazz.getSuperclass());
System.out.println("方法");
for (java.lang.reflect.Method method:enumClazz.getMethods() ) {
classMethodNameSet.add(method.getName());
}
System.out.println(classMethodNameSet);
return classMethodNameSet;
}
}
@Getter
enum DbType{
MYSQL("mysql","1"),
SQLSERVER("sqlserver","2"),
OTHER("other","999"),
;
private String desc;
private String key;
private DbType(String desc,String key){
this.desc=desc;
this.key=key;
}
static DbType getDbType(String dbType){
DbType[] dts=DbType.values();
for(DbType dt : dts){
if(dt.desc.equalsIgnoreCase(dbType)){
return dt;
}
}
return OTHER;
}
}
enum TestEnum{A,B}
输出结果
-------------开始分析------------------
父类 class java.lang.Enum
方法
[getClass, wait, valueOf, values, notifyAll, compareTo, notify, getDeclaringClass, hashCode, equals, name, toString, ordinal]
------------------------------
-------------开始分析------------------
java.lang.Comparable<E>
java.io.Serializable
父类 class java.lang.Object
方法
[getDeclaringClass, getClass, wait, hashCode, valueOf, equals, notifyAll, name, toString, compareTo, notify, ordinal]