欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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