java - 所有外部类实例总共只有 1 个静态嵌套类实例吗?如果没有单例模式,只能出现 1 个实例吗?

标签 java listener onclicklistener

我一直在研究在 Android 中制作监听器的不同方法。我将监听器封装在一个名为 OperationClick 的单独类中。 我还使用策略模式来封装逻辑,并与 enum 类型 BinaryOperator 进行交互。 code> 我拥有的是一个简单的计算器,您可能已经在网上看到过 - 2 个输入数字、1 个结果和 4 个按钮(+、-、* 和/)。

我所看到的是,我需要为 4 个按钮创建 4 个不同的监听器;但是,我封装了每个按钮的逻辑,因此我只需要 1 个监听器。唯一的问题是我需要用正确的逻辑区分每个监听器(BinaryOperator:+ - */)。

所以我将拥有 4 按钮,OperationClick4 实例,但我不知道静态嵌套类 Listener(在代码中********************行下方)。

所以我的主要问题是......

是否有 Listener1 实例,因为它被声明为 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/

相关文章:

Java 监听器继承

java - 监听 JFrame 的 Action

c# - 需要在 Selenium C# 中使用 EventFiringWebDriver 和 OnFindingElement 或 OnElementClicked 的工作示例?

android - 使用切换按钮创建收藏按钮

Android 避免在不使用 onSingleTapConfirmed 的情况下为双击调用单击两次

java - Neo4j-OGM 关系未加载

java.lang.IllegalStateException : Not on FX application thread; currentThread = Thread-4

java - 由于正在运行的线程,应用程序在关闭 fragment 时崩溃

java - 如何在 GWT 项目中在服务器之间传输对象?

java - Tomcat7 Spring Maven Mysql 对于类型 avax/el/ExpressionFactory 有不同的 Class 对象;