我一直在研究在 Android 中制作监听器的不同方法。我将监听器封装在一个名为 OperationClick 的单独类中。
我还使用策略模式来封装逻辑,并与 enum
类型 BinaryOperator 进行交互。
code> 我拥有的是一个简单的计算器,您可能已经在网上看到过 - 2 个输入数字、1 个结果和 4 个按钮(+、-、* 和/)。
我所看到的是,我需要为 4 个按钮创建 4 个不同的监听器;但是,我封装了每个按钮的逻辑,因此我只需要 1 个监听器。唯一的问题是我需要用正确的逻辑区分每个监听器(BinaryOperator:+ - */)。
所以我将拥有 4
按钮,OperationClick
的 4
实例,但我不知道静态嵌套类 Listener
(在代码中********************
行下方)。
所以我的主要问题是......
是否有 Listener
的 1
实例,因为它被声明为 static
,还是有 4
实例?
我创建(嵌套)静态类Listener
只是为了避免点击监听器的额外实例化......即只有1
实例OperationClick
的所有实例的 Listener
但是,如果我的逻辑是错误的,静态嵌套 Listener
类只有 1
实例,那么如何在没有单例模式?我认为将 static
添加到类中就可以做到这一点,但我不确定。
MainActivity.java
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());
OperationClick.java
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));
}
}
}
Operation.java(策略模式中的Context类)
public class Operation {
private IOperationStrategy strategy;
public Operation(IOperationStrategy strategy) { this.strategy = strategy; }
public double execute(double a, double b) { return this.strategy.executeOperation(a, b); }
}
最佳答案
嵌套静态类仍然支持多个实例。
对嵌套类使用和不使用 static
关键字的区别在于它是否具有对父类的隐藏引用。
减少不必要分配的最佳方法是完全删除 Listener
类,而只让 OperationClick
实现 View.OnClickListener
。
按照当前的结构,您的 Listener
类具有一个在构造时分配的 Operation
类型的实例字段。如果您只有一个Listener
,那么该监听器也只会处理一个Operation
,这可能不是您想要的。我会完全放弃这种方法。
关于java - 所有外部类实例总共只有 1 个静态嵌套类实例吗?如果没有单例模式,只能出现 1 个实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24589305/