Overview
-
枚举类型
-
枚举常量在类型安全性和便捷性都很有保证,如果出现类型问题,编译器会提醒我们改进
-
Day day = Day.MONDAY;
枚举实现原理
-
在使用关键字
enum
创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了java.lang.Enum
类 -
反编译的一个枚举类:
enum Day {
MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY, SUNDAY
}//反编译Day.class
final class Day extends Enum
{
//编译器为我们添加的静态的values()方法
public static Day[] values()
{
return (Day[])$VALUES.clone();
}
//编译器为我们添加的静态的valueOf()方法,注意间接调用了Enum也类的valueOf方法
public static Day valueOf(String s)
{
return (Day)Enum.valueOf(com/zejian/enumdemo/Day, s);
}
//私有构造函数
private Day(String s, int i)
{
super(s, i);
}
//前面定义的7种枚举实例
public static final Day MONDAY;
public static final Day TUESDAY;
public static final Day WEDNESDAY;
public static final Day THURSDAY;
public static final Day FRIDAY;
public static final Day SATURDAY;
public static final Day SUNDAY;
private static final Day $VALUES[];
static
{
//实例化枚举实例
MONDAY = new Day("MONDAY", 0);
TUESDAY = new Day("TUESDAY", 1);
WEDNESDAY = new Day("WEDNESDAY", 2);
THURSDAY = new Day("THURSDAY", 3);
FRIDAY = new Day("FRIDAY", 4);
SATURDAY = new Day("SATURDAY", 5);
SUNDAY = new Day("SUNDAY", 6);
$VALUES = (new Day[] {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
});
}
}-
final
类型 -
继承自
java,lang.Enum
类 -
前面使用关键字
enum
定义的每个枚举常量都是实在的Day实例对象 -
在编辑后,枚举类型的将会转换为一个实实在在的继承自
Enum
的类,而之前定义的常量也都会转换为对应的实例对象;同时编译器还会再创建两个对象:values()
和valueOf()
-
枚举的常见方法
Enum
抽象类的常见方法
返回类型 | 方法名称 | 方法说明 |
---|---|---|
int |
compareTo(E o) |
比较此枚举与指定对象的顺序 |
boolean |
equals(Object other) |
当指定对象等于此枚举常量时,返回 true。 |
Class |
getDeclaringClass() |
返回与此枚举常量的枚举类型相对应的 Class 对象 |
String |
name() |
返回此枚举常量的名称,在其枚举声明中对其进行声明 |
int |
ordinal() |
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零) |
String |
toString() |
返回枚举常量的名称,它包含在声明中 |
static<T extends Enum<T>> T |
static valueOf(Class enumType, String name) |
返回带指定名称的指定枚举类型的枚举常量 |
-
compareTo(E o)
方法则是比较枚举的大小,注意其内部实现是根据每个枚举的ordinal值大小进行比较的 -
name()
方法与toString()
几乎是等同的,都是输出变量的字符串形式 -
valueOf(Class enumType, String name)
方法则是根据枚举类的Class对象和枚举名称获取枚举常量 -
演示上述方法:
package cn.demo1;
public class EnumDemo {
public static void main(String[] args) {
Day[] days = new Day[]{
Day.MONDAY, Day.TUESDAY, Day.WEDNESDAY,
Day.THURSDAY, Day.FRIDAY, Day.SATURDAY,
Day.SUNDAY
};
System.out.println("/// ordinal() ///////////////////");
for (int i = 0; i < days.length; i++) {
System.out.println("days[" + i + "].ordinal(): " + days[i].ordinal());
}
System.out.println(" /// compareTo() ///////////////////");
System.out.println("days[0].compareTo(days[1]): " + days[0].compareTo(days[1]));
System.out.println("days[0].compareTo(days[2]): " + days[0].compareTo(days[2]));
System.out.println(" /// getDeclaringClass() ///////////////////");
Class<?> clazz = days[0].getDeclaringClass();
System.out.println("class: " + clazz);
System.out.println(" /// name() ///////////////////");
System.out.println("days[0].name()" + days[0].name());
System.out.println("days[1].name()" + days[1].name());
System.out.println("days[2].name()" + days[2].name());
System.out.println("days[3].name()" + days[3].name());
System.out.println(" /// toString() ///////////////////");
System.out.println("days[0].name()" + days[0].toString());
System.out.println("days[1].name()" +