我有这样一个菜单:
switch(menumain.getOpcao()){
case 1:
signIn();
break;
case 2:
signUp();
break;
}
}while (menumain.getOpcao()!=0);
我想删除switch语句并使用Enum创建菜单。那可能吗?目前我有这样的事情:
public enum menuInicial {
SIGNIN(1) {
TraderApp.signIn();
},
SIGNUP(2) {
public void doSomething() {
}
},
UNKNOWN(3) {
public void doSomething() {
}
};
private int value;
public abstract void doSomething();
private menuInicial(int value) {
this.value = value;
}
你能帮助我吗?
是的,你可以这样做(虽然我不确定将很多业务逻辑放入enum
是个好主意:
public enum MenuInicial {
SIGNIN(1, TraderApp::signIn),
SIGNUP(2, TraderApp::signUp),
UNKNOWN(3, () -> doSomething());
private int value;
private Runnable execution;
private MenuInicial(int val, Runnable toRun) {
int value = val;
execution = toRun;
}
public void execute() {
execution.run();
}
static void execute(int code) {
for (MenuInicial item : values()) {
if (item.value == code) {
item.run(); break;
}
}
throw new IllegalArgumentException("unknown code " + code);
}
};
这看起来像一台状态机;有点像:
enum State {
A(ctxt -> B),
B(ctxt -> C),
C(ctxt -> A);
protected final Function<CTXT, State> transition;
State(Function<CTXT, State> transition) {
this.transition = transition;
}
public State takeStep(CTXT context) {
// context.setState(this);
return transition.apply(context);
}
}
由于可以映射枚举(请参阅EnumMap和EnumSet),这可以通过没有逻辑的小枚举来实现,然后是转换的映射。战略模式。
但是当添加函数引用时:
enum State {
A(f::initialize),
B(g::work),
C(f::goodnight); ...
}
它可能变得紧凑。