Java 所有外部类实例是否总共只有一个静态嵌套类实例?如果没有单例模式,只能出现一个实例吗?

Java 所有外部类实例是否总共只有一个静态嵌套类实例?如果没有单例模式,只能出现一个实例吗?,java,listener,onclicklistener,Java,Listener,Onclicklistener,我一直在寻找在安卓系统中制作听众的不同方法。我将侦听器封装在一个名为OperationClick的单独类中。我还使用了策略模式来封装逻辑,该模式与enumtypeBinaryOperator接口。我拥有的是一个简单的计算器,您可能已经在网上看到了-2个输入数字、1个结果和4个按钮(+、-、*、和/) 我所看到的是,我需要为4个按钮创建4个不同的侦听器;但是,我封装了每个按钮的逻辑,因此我只需要1个侦听器。唯一的问题是,我需要用正确的逻辑区分每个侦听器(BinaryOperator:+-*/) 因

我一直在寻找在安卓系统中制作听众的不同方法。我将侦听器封装在一个名为
OperationClick的单独类中。
我还使用了策略模式来封装逻辑,该模式与
enum
type
BinaryOperator接口。
我拥有的是一个简单的计算器,您可能已经在网上看到了-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单击
implement
View.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); }

}