枚举类的应用场景
某些情况下,我们有固定的几个选项供选择,在没有枚举类之前,我们一般都选择定义为几个常量,而有枚举后,则可以用枚举来解决。比如我们在设计一个小游戏的时候,会用到有限的几个方向,每个方向定义了不同的动作,所以这个方向类就是有限个实例的情况,我们可以用枚举实现,或模拟枚举实现。
自己实现枚举:
package EnumDemo;
public abstract class Director {
// 提供有限的几个选项
// 抽象类本不可以new 但此处用匿名内部类的形式实现了Director中的move方法
// 表面上看似是new了一个Director,实际是new的它的子类对象,用Director接收
// 用的是多态的思想
public static final Director UP = new Director("UP"){
@Override
public void move() {
System.out.println("向上走");
}
};
public static final Director DOWN = new Director("DOWN"){
@Override
public void move() {
System.out.println("向下走");
}
};
public static final Director LEFT = new Director("LEFT"){
@Override
public void move() {
System.out.println("向左走");
}
};
public static final Director RIGHT = new Director("RIGHT"){
@Override
public void move() {
System.out.println("向右走");
}
};
private String name;
private Director(String name){
this.name = name;
}
public String getName(){
return this.name;
}
// 不同的方向在调用move时处理不同 所以这里定义为抽象方法
public abstract void move();
}
测试demo:
package EnumDemo;
public class DirectorDemo {
public static void main(String[] args) {
Director d = Director.UP;
System.out.println(d.getName());// UP
d.move(); // 向上走
}
}
java原生枚举:
package EnumDemo;
public enum DirectorEnum {
// 枚举项
UP("UP"){
@Override
public void move() {
System.out.println("向上走");
}
},
// 带参构造 并且匿名内部类的方式实现抽象方法
DOWN("DOWN") {
@Override
public void move() {
System.out.println("向下走");
}
},
LEFT("LEFT") {
@Override
public void move() {
System.out.println("向左走");
}
},
RIGHT("RIGHT") {
@Override
public void move() {
System.out.println("向右走");
}
};
private String name;
private DirectorEnum(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public abstract void move();
}
测试demo:
package EnumDemo;
public class DirectorEnumDemo {
public static void main(String[] args) {
DirectorEnum dd = DirectorEnum.DOWN;
System.out.println(dd.getName());// DOWN
dd.move();// 向下走
}
}
注:枚举中不一定要有抽象方法,此例中的抽象方法只是为了说明枚举类的高级用法。
枚举的注意事项:
定义枚举类要用关键字enum
所有枚举类都是Enum的子类
枚举类的第一行必须是枚举项
枚举类可以有构造器,但必须是private,其默认也是private
枚举类也可以有个抽象方法,但枚举项必须重写该方法