Java 所有外部类实例是否总共只有一个静态嵌套类实例?如果没有单例模式,只能出现一个实例吗?
我一直在寻找在安卓系统中制作听众的不同方法。我将侦听器封装在一个名为Java 所有外部类实例是否总共只有一个静态嵌套类实例?如果没有单例模式,只能出现一个实例吗?,java,listener,onclicklistener,Java,Listener,Onclicklistener,我一直在寻找在安卓系统中制作听众的不同方法。我将侦听器封装在一个名为OperationClick的单独类中。我还使用了策略模式来封装逻辑,该模式与enumtypeBinaryOperator接口。我拥有的是一个简单的计算器,您可能已经在网上看到了-2个输入数字、1个结果和4个按钮(+、-、*、和/) 我所看到的是,我需要为4个按钮创建4个不同的侦听器;但是,我封装了每个按钮的逻辑,因此我只需要1个侦听器。唯一的问题是,我需要用正确的逻辑区分每个侦听器(BinaryOperator:+-*/) 因
OperationClick的单独类中。
我还使用了策略模式来封装逻辑,该模式与enum
typeBinaryOperator接口。
我拥有的是一个简单的计算器,您可能已经在网上看到了-2个输入数字、1个结果和4个按钮(+、-、*、和/)
我所看到的是,我需要为4个按钮创建4个不同的侦听器;但是,我封装了每个按钮的逻辑,因此我只需要1个侦听器。唯一的问题是,我需要用正确的逻辑区分每个侦听器(BinaryOperator:+-*/)
因此,我将拥有4
按钮,4
操作的实例单击,但我不知道静态嵌套类侦听器的情况(在代码中的************
行下方)
所以我的主要问题是…
是否会有1
个Listener
实例,因为它被声明为static
,还是会有4个实例
我创建的(嵌套)静态类侦听器
完全是为了从click侦听器的额外实例化中进行保存…也就是说,对于操作click
然而,如果我的逻辑是错误的,只存在静态嵌套的Listener
类的1
实例,那么没有单例模式怎么办呢?我想向类中添加static
可以做到这一点,但我不确定
MainActivity.java
OperationClick.java
Operation.java(策略模式中的上下文类)
嵌套的静态类仍然支持多个实例
对嵌套类使用和不使用static
关键字的区别在于它是否有对父类的隐藏引用
减少不必要的分配的最佳方法是完全去掉Listener
类,只需执行operation单击implementView.OnClickListener
按照当前的结构,您的侦听器
类有一个类型为Operation
的实例字段,该字段是在构造时分配的。如果您只有一个侦听器
,那么该侦听器也只能处理一个操作
,这可能不是您想要的。我将完全放弃这种方法。好吗,我稍微编辑了这个问题。我如何才能确保只出现一个实例。我想一个单身汉可以做到这一点,但我想知道是否有更简单的方法。我完全明白你来自哪里,只是想确保策略模式的上下文类。是的,我的诊断没有改变-你的侦听器只有一个 操作
与之关联,因此您需要为正在侦听的每个操作
创建一个新的操作。为什么不声明MainActivity
以实现视图。OnClickListener
?然后只需将侦听器设置为this
(即活动
本身),并签入onClick(…)
单击按钮的方法。这似乎本身就有问题,但我可能已经回答了自己的问题,因为我只有一个侦听器实例,但它不知道在operation.execute(num1,num2)执行什么操作;
。这是因为我需要每个操作有一个实例,而不是总共一个实例。您认为@Squonk如何。如何确保变量操作
调用正确的执行方法(…)
如果我有MainActivity实现View.OnClickListener
这并不难…public类MainActivity扩展类实现View.OnClickListener{…}
。然后创建一个方法作为public void onClick(View v){…}
。在该方法中使用v.getId()
识别单击的按钮并使用开关/case
块。之后需要做的就是设置监听器,如btnAdd.setOnClickListener(此)
等等。你基本上是在思考问题,我刚才描述的是Android中的一种常见方法。是的,但我以前在操作中有一个switch语句,单击类处理该逻辑,但我的二进制操作
类将命名实例中的所有逻辑抽象掉。这意味着我可以完全去掉switch语句——我实际上更喜欢它……但是,您的方法似乎意味着我必须通过v.getId()
以另一种形式返回switch语句。这有点不可取
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));
}
}
}
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); }
}