枚举是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
,所以,这些类型以及这些类型的包装类型也是可以的。