枚举实现接口——模拟可扩展的枚举
概要
虽然无法编写可拓展的枚举类型,却可以通过编写接口以及实现该接口的基础枚举类型来对它进行模拟。
一、带有抽象方法的枚举
public enum Operation {
PLUS("+"){
public double apply(double x, double y) { return x+y; }
},
MINUS("-"){
@Override
public double apply(double x, double y) {
return x-y;
}
},
TIMES("*"){
@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 symbol;
Operation(String symbol){
this.symbol = symbol;
}
public abstract double apply(double x, double y);
@Override
public String toString() {
return this.symbol;
}
}
二、定义一个接口
将抽象方法放到接口中:
public interface Operation {
double apply(double x, double y);
}
三、让枚举实现接口
让枚举实现接口,基础版本:
/**
* @Date 2020/2/2
* @Author lifei
*/
public enum BasicOperation implements Operation{
PLUS("+"){
@Override
public double apply(double x, double y) {
return x+y;
}
},
MINUS("-"){
@Override
public double apply(double x, double y) {
return x-y;
}
},
TIMES("*"){
@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 symbol;
BasicOperation(String symbol){
this.symbol = symbol;
}
@Override
public String toString() {
return this.symbol;
}
}
扩展版本:
/**
* @Date 2020/2/2
* @Author lifei
*/
public enum ExtendedOperation implements Operation{
EXP("^"){
@Override
public double apply(double x, double y) {
return Math.pow(x, y);
}
},
REMAINDER("%"){
@Override
public double apply(double x, double y) {
return x%y;
}
};
private final String symbol;
ExtendedOperation(String symbol){
this.symbol = symbol;
}
@Override
public String toString() {
return this.symbol;
}
}
四、测试枚举的两种方法
测试枚举方法一:
private static <T extends Enum<T> & Operation> void test(Class<T> opEnumType, double x, double y){
for (Operation operation : opEnumType.getEnumConstants()) {
System.out.printf("%f %s %f = %f%n", x, operation, y, operation.apply(x, y));
}
}
测试枚举方法二:
private static void test(Collection<? extends Operation> opSet, double x, double y){
for (Operation op : opSet) {
System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
}
}
运行测试:
public static void main(String[] args) {
double x = 23;
double y = 15;
test(BasicOperation.class, x, y);
//test(ExtendedOperation.class, x, y);
test(Arrays.asList(ExtendedOperation.values()), x, y);
}
来源:CSDN
作者:翌人行动
链接:https://blog.csdn.net/hefrankeleyn/article/details/104145391