Java 不稳定的if语句&引用;“返回”;值,然后在退出之前,返回false子句的值 [更新]问题已通过“不稳定”if语句修复。答案在评论中。我提出了一个新问题来处理我的另一个问题-
我遇到了一个不应该发生的奇怪的if条件逻辑流 基本上,类Java 不稳定的if语句&引用;“返回”;值,然后在退出之前,返回false子句的值 [更新]问题已通过“不稳定”if语句修复。答案在评论中。我提出了一个新问题来处理我的另一个问题-,java,android,generics,if-statement,Java,Android,Generics,If Statement,我遇到了一个不应该发生的奇怪的if条件逻辑流 基本上,类Click中的方法listenOn(…)不应继续创建侦听器的新实例。一个已经足够好了,所以我要防止那些不必要的创造 然而,当我在MainActivity中设置一个简单的测试,在所有setOnClickListener检查listenOn(…)方法之前,我看到对该方法的第一次调用按预期工作,第二次似乎工作正常 …除了在true子句中出现return之后,它直接跳到false子句的return;但是,正在跳过新侦听器的创建 我不明白它为什么这样
Click
中的方法listenOn(…)
不应继续创建侦听器的新实例。一个已经足够好了,所以我要防止那些不必要的创造
然而,当我在MainActivity
中设置一个简单的测试,在所有setOnClickListener
检查listenOn(…)
方法之前,我看到对该方法的第一次调用按预期工作,第二次似乎工作正常
…除了在true子句中出现return
之后,它直接跳到false子句的return
;但是,正在跳过新侦听器的创建
我不明白它为什么这样做。我的代码中有一个错误,因为无论我按下哪个按钮,它都只执行除法运算。我添加了泛型,这个问题可能就是由此产生的
顺便说一下,我正在尝试不同的方法来创建听众。我不是在寻找“最好的方法”或“标准的方法”,我在寻找学习不同的东西,所以不要攻击我用来创建听众的方法
我希望你能解释一下 if语句的行为 及 为什么单击任何按钮时只进行除法操作
Click.java
公共类点击{
私人信托业务;
private View.OnClickListener监听器;
公共点击(T操作){
这个操作=操作;
}
public View.OnClickListener listenerOn(最终维护活动UI){
// ******************************************************
//第一步-转到false子句,并返回新的侦听器
//第二遍-goes to true子句,返回旧侦听器,然后转到
//false子句并返回侦听器;但是,它跳过
//新的View.OnClickListener。为什么??
// ******************************************************
if(侦听器!=null){
返回侦听器;
}否则{
listener=新视图。OnClickListener(){
@凌驾
公共void onClick(视图v){
双倍总计,num1,num2;
num1=Double.parseDouble(UI.txtNumber1.getText().toString());
num2=Double.parseDouble(UI.txtNumber2.getText().toString());
总计=操作。执行(num1,num2);
UI.txtreult.setText(Double.toString(总计)+“--v5”);
}
};
返回侦听器;
}
}
}
MainActivity.java
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
按钮btnAdd=(按钮)findViewById(R.id.btnAddition);
按钮btnSub=(按钮)findViewById(R.id.btnSubtract);
按钮btnMul=(按钮)findViewById(R.id.btnMultiple);
按钮btnDiv=(按钮)findViewById(R.id.btnDivide);
txtNumber1=(EditText)findViewById(R.id.txtNumber1);
txtNumber2=(EditText)findViewById(R.id.txtNumber2);
txtResult=(EditText)findViewById(R.id.txtResult);
//测试-检查listenerOn()的if条件
// ******************************************************
单击=新建单击(添加操作);
View.OnClickListener-listener=单击.listenerOn(此);
listener=单击.listenerOn(此);
// ******************************************************
btnAdd.setOnClickListener(新建单击(添加.操作).listenerOn(此));
btnSub.setOnClickListener(新建Click(Subtract.OPERATION).listenerOn(this));
setOnClickListener(新建Click(Divide.OPERATION).listenerOn(this));
btnMul.setOnClickListener(新建Click(Multiply.OPERATION).listenerOn(this));
}
如果在调试器中运行代码,从方法退出时,通常会看到指令指针在方法帧末尾跳转。无论如何,条件行得通。关于操作的问题:请发布一些操作
代码。我建议使用日志轻松查看它是否进入true或false子句。是的,我正在使用调试器,但我记得看到它们跳转到末尾括号,而不是返回语句。无论如何,我会很快更新我的代码。我可能很快会把这个问题改成与行动有关的问题。也许在下个月内hour@laalto我在这里为我的另一个问题创建了一个新问题-
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;
}
}
}
@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));
}