내 코드에서 큰 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에 의해 인스턴스를 둘러싸에 액세스 할 수 없기 때문에이 불가능하다. 내가 옵션 집합을 가지고 있기 때문에 값() 또는 valueOf()와 같은 메소드를 사용하는 것이 편리하지만 열거 형이 필요하다.하지만 스위치를 성장시키는 대신 한 줄을 호출하는 것이 좋다. 이 같은 sometghing을 달성하는 방법에 대한 아이디어가 있습니까? 아니면이 열거 형 생성자 호출을 가능하게하는 해결 방법이 있습니까? Option1(MyStrategy.this::action1)
?
'executeChoosenMethod (int i)'는 매우 un-OO 메서드이며, 모델을 만들기 위해 OO를 사용하려고합니다. 열거 형 (또는 인터페이스)을 전달하면 더 명확합니다. –