我有这样一个菜单:
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;
}
你能帮助我吗?
答案 0 :(得分:0)
是的,你可以这样做(虽然我不确定把很多业务逻辑放到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);
}
};
答案 1 :(得分:0)
看起来像状态机;有点像:
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); ...
}
它可能变得紧凑。