6.30 使用枚举类代替常量
程序员文章站
2022-05-21 08:18:29
...
JDK5开始支持枚举功能,以下枚举类:
public enum State {
ON,OFF;
}
枚举类State不能继承其它类,也不能被其它类继承,并且不能使用new创建State类型的对象。其实State可视为java.lang.Enum的子类,其中每一个枚举常量可视为State类型的实例,以下代码仅供理解:
public class State {
public static final State ON=new State();
public static final State OFF=new State();
private State(){}
}
State也可定义构造函数,如下:
public enum State {
ON("1","is on"),
OFF("2","is off");
private final String key;
private final String value;
private State(String key,String value){
this.key=key;
this.value=value;
}
public String getKey(){
return key;
}
public String getValue(){
return value;
}
}
编译器会给State类插入values(),调用此方法可以获取所有的枚举量。也可以通过反射获取所有的枚举量,如下:
State[] states=State.values();//values()由编译器插入
State[] states2=State.class.getEnumConstants();//通过反射获取枚举量
Assert.assertEquals(states.length, states2.length);
编译器还会给State插入valueOf(),此方法用于根据枚举量名称获取枚举量:
State state=State.valueOf("ON");//valueOf()由编译器插入
State state2=State.valueOf(State.class, "ON");//valueOf()继承于Enum类?
Assert.assertEquals(state, state2);
此外可使用java.util.EnumSet和java.util.EnumMap用于操作枚举量
枚举类可定义抽象方法,每个枚举量必须实现此抽象方法,如下:
注:利用此方式可实现策略设计模式,原书有一个更好的工资支付的例子
public enum Operation {
PLUS { double apply(double x, double y){return x + y;} },
MINUS { double apply(double x, double y){return x - y;} },
TIMES { double apply(double x, double y){return x * y;} },
DIVIDE { double apply(double x, double y){return x / y;} };
//抽象方法,每个枚举量必须实现此方法
abstract double apply(double x, double y);
}
与使用int类型的常量相比,使用枚举性能较低(因为需要创建枚举量对象),在移动设备上应考虑此问题
上一篇: Moo Volume
下一篇: 玛雅人的密码-BFS