我一直在研究在Android中制作听众的不同方法。我将侦听器封装在一个名为OperationClick.
的单独类中。我还使用了策略模式来封装逻辑,并且与enum
类型BinaryOperator.
接口我拥有的是一个简单的计算器,你可能已经在网上看到了 - 2个输入数字,1个结果和4个按钮(+, - ,*和/)。
我所看到的是我需要为4个按钮创建4个不同的听众;但是,我封装了每个按钮的逻辑,所以我只需要一个监听器。唯一的问题是我需要用正确的逻辑区分每个监听器(BinaryOperator:+ - * /)。
所以我将拥有4
按钮,4
OperationClick
个实例,但我不了解静态嵌套类 { {1}}(在代码中的Listener
行下方。)
所以我的主要问题是......
******************
是1
个实例,因为它已声明为Listener
,还是会有static
个实例?
我创建4
的目的只是为了节省点击侦听器的额外实例...即,(nested) static class Listener
实例只有1
的所有实例Listener
但是,如果我的逻辑错误只有OperationClick
静态嵌套1
类的实例那么如何在没有Singleton模式的情况下完成?我认为在课堂上添加Listener
可以做到这一点,但我不确定。
static
btnAdd.setOnClickListener(new OperationClick(this, Add).getListener());
btnSub.setOnClickListener(new OperationClick(this, Subtract).getListener());
btnMul.setOnClickListener(new OperationClick(this, Multiply).getListener());
btnDiv.setOnClickListener(new OperationClick(this, Divide).getListener());
public class OperationClick {
private View.OnClickListener listener;
public OperationClick(MainActivity activity, BinaryOperation operator) {
this.listener = new Listener(activity, operator.getOperation());
}
public View.OnClickListener getListener() { return this.listener; }
****************************************************************************
// Static Nested Class - Does this make only one instance of Listener even with multiple OperationClick instances?
private static class Listener implements View.OnClickListener {
MainActivity UI;
Operation operation;
public Listener(MainActivity activity, Operation operation) {
this.UI = activity;
this.operation = operation;
}
@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));
}
}
}
答案 0 :(得分:2)
嵌套的静态类仍然支持多个实例。
使用和不使用嵌套类的static
关键字之间的区别在于它是否具有对父类的隐藏引用。
减少不必要的分配的最佳方法是完全摆脱Listener
类,只需OperationClick
实现View.OnClickListener
。
按照当前结构,您的Listener
类具有在构造时分配的类型Operation
的实例字段。如果你只有一个Listener
,你也只有一个Operation
由该听众处理,这可能不是你想要的。我完全放弃了这种方法。