手动实现枚举类
在JDK5之前是没有枚举类的,之前可以通过使用定义类的方式类实现。
通过private将构造器隐藏起来。
把这个类的所有可能的实例都使用public static final修饰的类变量来保存。
如果有必要,可以提供一些静态方法,允许其他程序根据特定参数来获取与之匹配的实例
使用枚举类可以使程序更加健壮,避免创建对象的随意性
枚举入门
JDK5新增了一个enum关键字来定义枚举。它可以有自己的成员变量、方法、可以实现一个或者多个接口、也可以定义自己的构造器。
枚举类和普通类的区别
枚举类可以实现一个或者多个接口,但是不能继承,因为enum已经默认继承java.lang.Enum类。其中java.lang.Enum类已经实现了java.lang.Serializable和java.lang.Comparable两个接口。
使用enum定义、非抽象的枚举类默认使用final修饰,因此枚举类不能派生子类。注意这里是非抽象的枚举类,抽象枚举类是可以派生的,例如实现接口的enum,例如第一个例子。
枚举类的构造器只能使用private访问器,可以省略
枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需程序显示添加。
实现接口的枚举类
public enum Gender implements GenderDesc {
//必须在第一行显示列出,系统会为其自动添加public static final
//对于该处创建的MALE和FEMALE实例,并不是直接创建Gender枚举类的实例,而是相当于创建Gender的匿名子类的实例
//编译成功之后会生成Gender.class Gender$1.class Gender$2.class 三个文件,所以下面的两个实例实际上是Gender匿名子类的实例
MALE("男") {
@Override
public void show() {
}
},
FEMALE("女") {
@Override
public void show() {
}
};
private final String name;
//枚举类的构造器只能使用private修饰
Gender(String name) {
this.name = name;
}
}
包含抽象方法的枚举类
public enum Gender {
//枚举类中定义抽象方法时不能使用abstract关键字将枚举类定义为抽象类,因为系统会自动为包含抽象方法的enum添加abstract关键字
//又因为枚举类需要显示创建枚举值,而不是作为父类,所以定义每一个枚举值时必须为抽象方法提供实现,否则会发生编译错误
MALE("男") {
@Override
public void show() {
}
},
FEMALE("女") {
@Override
public void show() {
}
};
private final String name;
//枚举类的构造器只能使用private修饰
Gender(String name) {
this.name = name;
}
//定义的抽象方法
public abstract void show();
}