使用接口模拟可扩展的枚举

public interface Operation {
double apply(double x, double y);
} 
public enum BasicOperation implements Operation {
PLUS("+") {
public double apply(double x, double y) { return x + y; }
},
MINUS("-") {
public double apply(double x, double y) { return x - y; }
},
TIMES("*") {
public double apply(double x, double y) { return x * y; }
},
DIVIDE("/") {
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 symbol;
}
}

虽然枚举类型( BasicOperation )不可扩展,但接口类型( Operation )是可以扩展的,并
且它是用于表示 API 中的操作的接口类型

// Emulated extension enum
public enum ExtendedOperation implements Operation {
EXP("^") {
public double apply(double x, double y) {
return Math.pow(x, y);
}
},
REMAINDER("%") {
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 symbol;
}
}

只要 API 编写为接口类型( Operation ),而不是实现( BasicOperation ),现在就可以在
任何可以使用基本操作的地方使用新操作。请注意,不必在枚举中声明 apply 抽象方法,就像您在具
有实例特定方法实现的非扩展枚举中所做的那样
不仅可以在任何需要「基本枚举」的地方传递「扩展枚举」的单个实例,而且还可以传入整个扩展
枚举类型,并使用其元素。

public static void main(String[] args) {
double x = Double.parseDouble(args[0]);
double y = Double.parseDouble(args[1]);
test(ExtendedOperation.class, x, y);
} 
private static <T extends Enum<T> & Operation> void test(
Class<T> opEnumType, double x, double y) {
for (Operation op : opEnumType.getEnumConstants())
System.out.printf("%f %s %f = %f%n",
x, op, y, op.apply(x, y));
}

总之,虽然不能编写可扩展的枚举类型,但是你可以编写一个接口来配合实现接口的基本的枚举类
型,来对它进行模拟

posted @ 2020-09-04 04:00  webzom  阅读(178)  评论(0)    收藏  举报