枚举类型的类具有个数有限且固定的实例,比如以一桌麻将的视角来看,只能有四个玩家,并且不许中途换场(final)。
enum 是JDK1.5后声明的关键字,令人惊奇的是在JDK1.5前enum连保留字也不是,所以有些残留的程序会将enum作为变量命使用,如果使用1.5以后的JDK将导致程序的错误,最著名的就是tomcat4,其中有大量声明为enum的变量。
不适用enum如何自己实现一个枚举类呢?
枚举类应该有以下特点。
(1) 实例是固定且有限的。
(2) 特点(1)决定了其构造器必须是私有的
(3) 可以访问它的实例。
public class Play {
private String name;
private long money;
private Play(String name, long money) {
this.name = name;
this.money = money;
}
private final static Play PLAY_1 = new Play("宋三思", 60L);
private final static int PLAY1 = 1;
private final static Play PLAY_2 = new Play("刘二狗", 60000L);
private final static int PLAY2 = 2;
private final static Play PLAY_3 = new Play("赖一炮", 600000L);
private final static int PLAY3 = 3;
private final static Play PLAY_4 = new Play("五零光", 60000L);
private final static int PLAY4 = 4;
public static Play getPlay(int num) {
switch (num) {
case PLAY1:
return PLAY_1;
case PLAY2:
return PLAY_2;
case PLAY3:
return PLAY_3;
case PLAY4:
return PLAY_4;
default:
return null;
}
}
public void in () {
System.out.println(this.name + "进入了游戏" +"\n他有"+this.money+"金币");
}
public static void main(String[] args) {
Play.getPlay(1).in();
}
}
有了enum关键字就不用再手动创建枚举类型了。
枚举类是一个特殊的类,从这句话可以得到俩条信息。
(1) 它终究还是一个类:所以它可以有属性、方法和构造器。
(2) 它是特殊的:根据枚举类其实例时固定的,所以其构造器必须是私有的。
public enum Session {
SPRING("春"),SUMMER("夏"),FALL("秋"),WINTER("东");
private Session(String name) {
this.name = name;
}
private String name;
public void say() {
System.out.println("我是" + this.name + "天");
}
}
初看语法似乎有些别扭,当为枚举类型声明了私有构造器后它的实例必须显示用它来初始化。
SPRING("春") 等价于 Session SPRING = new Session(“春”)
枚举类实现接口的实例
public interface Info {
public void info();
}
public enum Session implements Info{
SPRING("春") {
@Override
public void info() {
System.out.println("我是春天的实例");
}
};
private Session(String name) {
this.name = name;
}
private String name;
public void say() {
System.out.println("我是" + this.name + "天");
}
@Override
public void info() {
System.out.println("我是季节的实例");
}
}
SPRING("春") {
@Override
public void info() {
System.out.println("我是春天的实例");
}
};
这个语法似乎又有点别扭,实际上它相当于
Session SPRING = new Session(“春”) {
@Override
public void info() {
System.out.println("我是春天的实例");
}
}
也就是此时生成的并不是Session实例,而是Session的子类的实例,并且这里重写了info方法