枚举初步
2012-09-14 08:39 尔 阅读(118) 评论(0) 收藏 举报枚举类型的类具有个数有限且固定的实例,比如以一桌麻将的视角来看,只能有四个玩家,并且不许中途换场(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方法