自动生成的 values 和 valueOf-潍坊IT培训负责整理
Java 编译枚举类型时,自动加上两个静态方法 values 和 valueOf.如果我们定义了签名完全相同的方法会编译报错 "已在枚举中定义了方法 values".
枚举类型使用私有静态变量 $VALUES 存储所有的值,在静态初始化中赋值,类型为数组,值为所有枚举值,用于 values 和 valueOf 方法.
values 方法的作用是返回所有枚举值,实现很简单,就是 clone 一下 $VALUES 的值.valueOf 方法的作用是根据枚举值的名称返回枚举值,实现方法是调用 Enum.valueOf 方法,后文会在 Enum 类型中介绍这个方法.
Enum 类型
Enum 类型是 Java 中所有枚举类型的父类,并且是抽象类.需要注意的是我们不能直接继承 Enum 类,只有编译器生成的枚举最终的 class 可以继承,直接继承会导致编译器报错 "类无法直接扩展 java.lang.Enum".
Enum 类型提供了我们常用的 name() 和 ordinal() 方法,其中的 name 和 ordinal 变量都是 final 类型.
private final String name;public final String name() { return name;}private final int ordinal;public final int ordinal() { return ordinal;}
Enum 拥有一个构造器,参数为 name 和 ordinal.经过前面的分析可以知道,这个构造器我们是没有办法直接调用的,只有编译器编译的枚举类型可以调用.
protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal;}
Enum 定义了一个 valueOf 方法,用于枚举类型调用.可以看到 SexTwo 中的 valueOf 方法就是调用 Enum.valueOf(SexTwo,s) 实现的.
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);}
Enum 中的大部分方法都是 final 类型的,因此枚举类型是没有办法覆盖这些方法的,唯一能够覆盖的就是 toString 方法.
枚举 与 Class
前面我们已经看到,values 方法是编译器自动加到枚举类型上的,而 Enum 类型并没有提供 values 方法,也就是说我们把枚举类型向上转型为 Enum 类型后没法调用 values 方法.或者我们可能需要传递 Class 对象进行反射操作,这种情况下如何操作枚举呢?
Class 对象的 isEnum() 方法可以用来判断是否是枚举类型,如果是枚举类型该方法返回 true.Class 对象的 getEnumConstants() 方法可以用来获取所有枚举值.
以上就是潍坊IT培训给大家做的内容详解,更多关于IT的学习,请继续关注潍坊IT培训