我试图从我的代码中去掉大的 switch 语句,我认为基于我现有枚举的策略模式会很好。这个概念是这样的:
public class MyStrategy {
public MyStrategy() {
Option.Option1.setMethodToExecute(this::action1);
Option.Option2.setMethodToExecute(this::action2);
}
public void executeChoosenMethod(int i) {
Option.values()[i].execute();
// instead of
// switch(convertItoOption()) {
// case Option1:...
// case Option2:...
// }
}
private void action1() {
System.out.println("action1");
}
private void action2() {
System.out.println("action2");
}
private enum Option {
Option1, Option2;
private InvokeAction methodToExecute;
public void setMethodToExecute(InvokeAction methodToExecute) {
this.methodToExecute = methodToExecute;
}
public void execute() {
methodToExecute.execute();
}
}
@FunctionalInterface
private interface InvokeAction {
void execute();
}
}
所以我可以像这样使用它:
public class StrategyTest {
public static void main(String[] args) {
MyStrategy strategy = new MyStrategy();
//user choose 0 or 1
strategy.executeChoosenMethod(0);
strategy.executeChoosenMethod(1);
}
}
但我不喜欢这部分,Option.Option1.setMethodToExecute(this::action1);
因为我的枚举有越来越多的选择,我想把所有这些都放在枚举中。完美的是这样的:
public class MyStrategy {
public void executeChoosenMethod(int i) {
Option.values()[i].execute();
}
private void action1() {
System.out.println("action1");
}
private void action2() {
System.out.println("action2");
}
private enum Option {
Option1(MyStrategy.this::action1),
Option2(MyStrategy.this::action2);
private InvokeAction methodToExecute;
private Option(InvokeAction method) {
methodToExecute = method;
}
public void execute() {
methodToExecute.execute();
}
}
@FunctionalInterface
private interface InvokeAction {
void execute();
}
}
但这是不可能的,因为枚举是静态的,我无法通过 MyStrategy.this 访问封闭实例。我需要枚举,因为我有一组选项,并且使用 values() 或 valueOf() 等方法很方便,但我想要的是单行调用而不是增长开关。您是否有任何想法如何实现这样的事情,或者是否有任何解决方法可以使这个枚举构造函数调用成为可能Option1(MyStrategy.this::action1)
?