基本使用
演示代码:
enum ComputeEnum{
PLUS("加"){
@Override
public long compute(long a, long b){
return a + b;
}
},
SUBTRACT("减"){
@Override
public long compute(long a, long b){
return a - b;
}
},
MULTIPLY("乘"){
@Override
public long compute(long a, long b){
return a * b;
}
},
DIVIDE("除"){
@Override
public long compute(long a, long b){
return a / b;
}
},
;
ComputeEnum(String desc){
this.desc = desc;
}
private final String desc;
public abstract long compute(long a, long b);
}
通过查询资料发现,所有的枚举都继承自java.lang.Enum
这个类:public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {...}
,通过阅读源码,发现该类就本质就是一个抽象类。
下面的模拟伪代码是更加直观的剖析:
abstract class ComputeEnum{
public static final ComputeEnum PLUS= new ComputeEnum() {
@Override
void method() {
System.out.println("抽象方法");
}
};
public static final ComputeEnum SUBTRACT= new ComputeEnum() {
@Override
void method() {
System.out.println("抽象方法");
}
};
abstract void method();
}
Enum的扩展
枚举可以被看成是一个普通类,只是多了一些特性:无法被继承。简易计算器实现了基本的加减乘除操作,但是如果未来需要添加新的计算操作,比如:取余、乘方等等操作,那么就需要在原有的枚举中添加新的实例,这就违背了开闭原则。比较好的做法是将枚举中的计算函数抽离出去成一个接口,让枚举实现该接口,让客户端依赖于该计算接口,而不是依赖于实现,这样客户端所依赖的是一个稳定的接口,可以动态根据不同场景的实现不动的计算。
演示代码:
interface Operation{
long compute(long a, long b);
}
enum BaseComputeEnum implements Operation{
PLUS("加"){
@Override
public long compute(long a, long b){
return a + b;
}
},
SUBTRACT("减"){
@Override
public long compute(long a, long b){
return a - b;
}
},
MULTIPLY("乘"){
@Override
public long compute(long a, long b){
return a * b;
}
},
DIVIDE("除"){
@Override
public long compute(long a, long b){
return a / b;
}
},
;
BaseComputeEnum(String desc){
this.desc = desc;
}
private final String desc;
}
enum ExtendComputeEnum implements Operation{
MOD("取模"){
@Override
public long compute(long a, long b){
return a % b;
}
},
;
ExtendComputeEnum(String desc){
this.desc = desc;
}
private final String desc;
}