所有外部类实例只有一个静态嵌套类实例总数吗?没有单例模式只能出现1个实例吗?

时间:2014-07-05 18:22:25

标签: java listener onclicklistener

我一直在研究在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可以做到这一点,但我不确定。

MainActivity.java

static

OperationClick.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());

Operation.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));

        }
    }
}

1 个答案:

答案 0 :(得分:2)

嵌套的静态类仍然支持多个实例。

使用和不使用嵌套类的static关键字之间的区别在于它是否具有对父类的隐藏引用。

减少不必要的分配的最佳方法是完全摆脱Listener类,只需OperationClick实现View.OnClickListener

按照当前结构,您的Listener类具有在构造时分配的类型Operation的实例字段。如果你只有一个Listener,你也只有一个Operation由该听众处理,这可能不是你想要的。我完全放弃了这种方法。