将控制台菜单切换为枚举

时间:2017-12-21 13:48:11

标签: java enums switch-statement

我有这样一个菜单:

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

你能帮助我吗?

2 个答案:

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

它可能变得紧凑。