开关中的开关

时间:2017-08-01 12:26:46

标签: java android

我想有一个记忆我当前所在菜单的开关,然后检查按下了什么按钮,这样它就可以引导我去另一个活动。

目前我已经提出了这个问题,但由于某种原因,当我调试第二种情况时:case R.id.bt1甚至没有达成。

我已经输入了变量类:public static int currentMenu = 0;但是当我将其设置为1时,我的调试器变得非常奇怪。

任何人都可以弄清楚我可能做错了什么吗?

@Override
public void onClick(View view) {
    int currentMenu = Variables.currentMenu;
    switch (currentMenu) {
        case 0:
            switch (view.getId()) {
                case R.id.bt1:
                    currentMenu = 1;
                    Variables.currentMenu = currentMenu;
                    checkMenu();
                    break;
                case R.id.bt2:
                    currentMenu = 2;
                    Variables.currentMenu = currentMenu;
                    checkMenu();
                    break;
                case R.id.bt3:
                    break;
            }
        case 1:
            switch (view.getId()) {
                case R.id.bt1:
                    currentMenu = 0;
                    Variables.currentMenu = currentMenu;
                    checkMenu();
                    break;
                case R.id.bt2:
                    Intent adam = new Intent(Home.this, BattleScene.class);
                    startActivity(adam);
                    Variables.currentMenu = 0;
                    break;
                case R.id.bt3:
                    break;
            }
    }

2 个答案:

答案 0 :(得分:3)

直接答案:您错过了外部开关的中断

但为什么会发生这种情况 - 导致真正的答案:甚至尝试编写此类代码。

严重违反了Single Layer of Abstraction原则。

其效果明显:这样的代码在您关闭编辑器时会变成 spaghetti 代码。您甚至似乎尝试在“内部”时更改您在“外部”侧切换的变量的内容。令人难以置信。以消极的方式。

换句话说:你刚开始编写这段代码,但你无法正确理解。原因是因为你决定使用复杂的方式表达你的想法。

长话短说:使用开关来做出决定驱动行为是“程序性”编程。处理此类事物的OOP方式:使用状态机器。而不是要求状态和切换它,调用对象上的方法。这些对象可能会返回您可以调用方法的其他对象。

答案 1 :(得分:1)

你的外switch有一个堕落。就像你在内部switch中所做的那样,你很可能希望在每个break的末尾case

@Override
public void onClick(View view) {
    int currentMenu = Variables.currentMenu;
    switch (currentMenu) {
        case 0:
            switch (view.getId()) {
                // omitted for readability
            }
            break; // <-- outer break
        case 1:
            switch (view.getId()) {
                // omitted for readability
            }
            break; // <-- outer break
    }