枚举初步

来源:互联网 发布:redis mysql完美结合 编辑:程序博客网 时间:2024/06/06 17:31

枚举类型的类具有个数有限且固定的实例,比如以一桌麻将的视角来看,只能有四个玩家,并且不许中途换场(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 + "天");    }@Overridepublic 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方法


原创粉丝点击