如果陈述不稳定。在true子句上“返回”值,然后在退出之前,它返回false子句的值

时间:2014-07-07 13:48:04

标签: java android generics if-statement

[更新]问题以“不稳定”if语句修复。答案在评论中。我创建了一个新问题来处理我的另一个问题 - Multiple Buttons, 1 ClickListener using generics, Strategy Patter - All buttons only do the same operation

我遇到了一个不应该发生的奇怪的if条件逻辑流程。

基本上,类listenOn(...)中的方法Click不应继续创建侦听器的新实例。一个是足够好的,所以我要防范那些不必要的创作。

但是,当我在所有MainActivity之前的setOnClickListener中设置一个简单的测试来检查listenOn(...)方法时,我看到对该方法的第一次调用就像打算,第二次似乎有效...

...除了 return出现在true子句中之外,它直接跳到false子句的return;但是,跳过了新Listener的创建。

我无法理解为什么会这样做。我的代码中有一个错误,因为无论我按哪个按钮,它只进行除法操作。我添加了Generics,这个问题可能来自那个。

顺便说一下,我正在尝试不同的方法来创建听众。我不是在寻找“最好的方法”,或“标准方式”,我希望学习不同的东西,所以不要攻击我用来创建监听器的方法。


如果你能解释一下我想要...

if-statment的行为

为什么我点击任何按钮

时才会发生分组

Click.java

public class Click<T extends Operation> {

    private T operation;

    private View.OnClickListener listener;

    public Click(T operation) {

        this.operation = operation;

    }

    public View.OnClickListener listenerOn(final MainActivity UI) {

        // ******************************************************
        // First pass - goes to false-clause, and returns that new listener
        // Second pass - goes to true-clause, returns the old listener, and then goes to the 
        //               false-clause and returns the listener; however, it skips the creation of 
        //               the new View.OnClickListener. Why??
        // ******************************************************
        if (listener != null) {

            return listener;

        } else {

            listener = new View.OnClickListener() {

                @Override
                public void onClick(View v) {

                    double total, num1, num2;

                    num1 = Double.parseDouble(UI.txtNumber1.getText().toString());
                    num2 = Double.parseDouble(UI.txtNumber2.getText().toString());

                    total = operation.execute(num1, num2);

                    UI.txtResult.setText(Double.toString(total) + " -v5");

                }
            };

            return listener;

        }
    }

}

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button btnAdd = (Button) findViewById(R.id.btnAddition);
    Button btnSub = (Button) findViewById(R.id.btnSubtract);
    Button btnMul = (Button) findViewById(R.id.btnMultiple);
    Button btnDiv = (Button) findViewById(R.id.btnDivide);

    txtNumber1 = (EditText) findViewById(R.id.txtNumber1);
    txtNumber2 = (EditText) findViewById(R.id.txtNumber2);
    txtResult = (EditText) findViewById(R.id.txtResult);

    // Testing - Checks the if-conditional of listenerOn()
    // ******************************************************
    Click click = new Click<>(Add.OPERATION);
    View.OnClickListener listener = click.listenerOn(this);

    listener = click.listenerOn(this);
    // ******************************************************


    btnAdd.setOnClickListener(new Click<>(Add.OPERATION).listenerOn(this));
    btnSub.setOnClickListener(new Click<>(Subtract.OPERATION).listenerOn(this));
    btnDiv.setOnClickListener(new Click<>(Divide.OPERATION).listenerOn(this));
    btnMul.setOnClickListener(new Click<>(Multiply.OPERATION).listenerOn(this));

}

0 个答案:

没有答案