将控制台菜单切换为枚举

问题描述 投票:0回答:2

我有这样一个菜单:

 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;
   }

你能帮助我吗?

java enums switch-statement
2个回答
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);
    }
};

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); ...
}

它可能变得紧凑。

© www.soinside.com 2019 - 2024. All rights reserved.