java 1.5之后出现枚举类型,枚举类型的出现为开发者提供类型安全的检测和提高可读性;当然枚举的使用有一个缺点就是相比于int定义的标志位,装载和初始化枚举时会有空间和时间成本;所以除了小型终端,实践中不必太在意这个问题;
......
public static final int Apple_FUJI = 0;
public static final int Apple_PIPPN = 1;
public static final int Apple_BLOOD = 2;
public static final int Orange_FUJI = 3;
public static final int Orange_PIPPN = 4;
public static final int Orange_BLOOD = 5;
......
1 .使用int是脆弱的,int枚举是编译时常量用final修饰,当int常量发生变化时候,若要达到预期效果必须重新编译(final 只能初始化一次)
2 .使用int是不友好的,int只能获取相应的int值,不能打印所表示的常量的字符串,code的阅读性是不高的,换句话说不提供文档你甚至不知道怎么命名,怎么赋值;
3 .使用int常量的命名是有限制的,在使用int的时候要严格避免重名,而且你无法获取int常量的size;
用String来记录标志位,和int其实差不多,但也有所不同:
优点: 可以打印出想要得到的字符串名,其他一无是处
缺点: String的比较不能直接使用’==’,必须使用equals(),会影响性能
对比与int等基本数据类型以及String,他除了装载和初始化枚举时会有空间和时间成本之外,可以完美解决前两者的所有隐患;
public abstract class Enum>
implements Comparable, Serializable {
/**
* The name of this enum constant, as declared in the enum declaration.
* Most programmers should use the {@link #toString} method rather than
* accessing this field.
*/
private final String name;
/**
* Returns the name of this enum constant, exactly as declared in its
* enum declaration.
*
* Most programmers should use the {@link #toString} method in
* preference to this one, as the toString method may return
* a more user-friendly name. This method is designed primarily for
* use in specialized situations where correctness depends on getting the
* exact name, which will not vary from release to release.
*
* @return the name of this enum constant
*/
public final String name() {
return name;
}
......
枚举类继承了 Comparable, Serializable,而且都是final不可变的修饰,不会出现线程不安全的问题;
在枚举中不仅可以存储枚举常量,还可以存储任意方法和域,但是继续强调一点,枚举可以继承接口,但是枚举本身不可以扩展;
下面来看一下代码:
public enum Opration {
PLUS,DIVIDE;
public double apply(double x,double y){
switch (this){
case PLUS:
return x + y;
case DIVIDE:
return x - y;
}
throw new AssertionError("unkown");
}
}
这是一个实现加减法的enum,声明了两个枚举常量:PLUS,DIVIDE;注意:
枚举中常量是可以与方法关联的,也就是说PLUS和DIVIDE可以调用Opration中任意方法,当然包括其构造;
但是出于一个合格的java开发者,上面代码是不符合java开闭原则的,当要在Opration中添加其他枚举常量还必须在switch中添加case:
那么我们下面来优化代码:
public enum Opration {
PLUS("+") {
@Override
public double apply(double x, double y) {
return x+y;
}
},
DIVIDE("-"){
@Override
public double apply(double x, double y) {
return x-y;
}
};
private final String sym;
Opration(String sym) {
this.sym = sym;
}
public abstract double apply(double x,double y)
}
这样当添加一种运算方式时候,只需要单独实现其抽象apply就ok了,不用太多关注apply中的switch;
感谢阅读,欢迎pick!!!