枚举(Enum)

枚举是jdk1.5之后的新特性

例如说:在国外利用A、B、C、D、E代表分数的等级,在没有枚举之前我们采用如下的方式来有效的限制取值范围:

 class Grade
 {
	public static final Grade A = new Grade();
	public static final Grade B = new Grade();
	public static final Grade C = new Grade();
	public static final Grade D = new Grade();
	public static final Grade E = new Grade();
	
	private Grade(){}
}
加入枚举后,我们可以使用一种更加简便的方式:

enum Grade //class A:100-90 B:89-80 C:79-70 D:69-60 E:59-0 
{
	A("100-90"),B("89-80"),C("79-70"),D("69-60"),E("59-0"); //Object
	
	private String value;
	
	private Grade(String value)
	{
		this.value = value;
	}
	
	/**
	 * 获取分数范围
	 * @return 分数范围
	 */
	public String getValue()
	{
		return this.value;
	}
}

可以使用"枚举.variable"的形式取出枚举中的指定内容,例如上面的枚举调用Grade.A

枚举(Enum):我们所定义的每个枚举类型都继承自java.lang.Enum类,枚举中的每个成员默认都是public static final的。

每个枚举的成员其实就是您定义的枚举类型的一个实例(Instance).

换句话来说,当定义了一个枚举类型后,在编译时刻就能确定该枚举类型有几个实例,分别是什么。在运行期间我们无法再使用该枚举创建新的实例了,这些实例在编译期间就已经完全确定下来了。

例子:如何定义枚举的构造函数、方法和字段去封装更多的信息
// 带抽象方法的枚举
enum Grade // class A:100-90 优 B:89-80 良 C:79-70 中 D:69-60 差 E:59-0 不及格
{
	A("100-90") {
		public String localValue() {
			return "优";
		}
	},
	B("89-80") {
		public String localValue() {
			return "良";
		}
	},
	C("79-70") {
		public String localValue() {
			return "中";
		}
	},
	D("69-60") {
		public String localValue() {
			return "差";
		}
	},
	E("59-0") {
		public String localValue() {
			return "不及格";
		}
	}; // Object

	private String value;

	private Grade(String value) {
		this.value = value;
	}

	public String getValue() {
		return this.value;
	}

	public abstract String localValue();
}
上述代码是假如成绩在国外表示方式为A、B、C、D、E,而我们想获得它的中文表现形式,因此采用抽象方法的方式

例子:采用枚举来实现单例模式
/**
 * 用单例模式定义出一个枚举类
 * @author asus
 *
 */
enum A
{
	A;
}
枚举也是一个类,因此也能实现接口。在一些游戏项目中我们需要使用上下左右来表示方向,之前是使用0、1、2、3来分别表示。这样的表示方式不利于项目组的其他成员阅读我们的代码,增加了工作量。因此我们采用枚举的方式来代替上述方式
public enum Direction {
	UP,DOWN,LEFT,RIGHT;	
}
在Hunter类中
public class Hunter 
{

	private int x,y,speed;
	
	private Direction dir;
	
	public Hunter(int x,int y,int speed)
	{
		this.x = x;
		this.y = y;
		this.speed = speed;
		dir = Direction.RIGHT;
	}
	
	private void back() {
		switch(dir)
		{
			case DOWN:
				y -= speed + 4; 
				break;
			case UP:
				y += speed + 4;
				break;
			case LEFT:
				x += speed + 4;
				break;
			case RIGHT:
				x -= speed + 4;
				break;
		}
	}

	public void move() {
		switch(this.dir)
		{
			case UP:
				this.y -= this.speed;
				break;
			case DOWN:
				this.y += this.speed;
				break;
			case LEFT:
				this.x -= this.speed;
				break;
			case RIGHT:
				this.x += this.speed;
				break;
		}
	}
}


 
  
 switch 
  
 expr1 
 )中, 
 expr1 
 只能是一个整数表达式或者 
 枚举常量 
 ,整数表达式可以是 
 int 
 基本类型或 
 Integer 
 包装类型,由于, 
 byte,short,char 
 都可以隐含转换为 
 int 
 ,所以,这些类型以及这些类型的包装类型也是可以的。 
 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值