枚举初步

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值