【问题标题】:Anonymous inner classes: declared as instance variables vs creating on the fly匿名内部类:声明为实例变量与动态创建
【发布时间】:2013-03-21 20:10:43
【问题描述】:

我正在重构一个具有面向公众的接口的类,考虑到它的用法让我问:

在一些较大的类(作为实例变量)中声明以下内容有什么区别:

private final OnClickListener mButtonOnClickListener = new OnClickListener() {
    @Override
    public void onClick(View view) {            
        //some codes
    }
};

vs 声明为匿名内部类如下(即时):

private void someFunctionInClass() {
    someOtherFunctionThatTakesAnOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {            
            //some codes
        }
    });
}

更具体地说,前者是否仍被视为匿名内部类?我在this answer 中读到一个匿名内部类

是在另一个类的方法体中创建和定义的方法

我给出的第一个示例是在另一个类的主体中创建和定义的,但不像第二个示例那样在另一个类的方法中创建和定义。它仍然是一个匿名内部类吗?此外,一个人与另一个人的公认做法是什么?将匿名内部类声明为实例变量(我认为仍然如此)是否更有效,因为不需要重新创建新对象?

【问题讨论】:

  • 匿名类就是匿名类。在这两种情况下仍然只创建了 一个 [匿名] 类型 - 结果实例的使用与类型本身无关。

标签: java anonymous-class anonymous-inner-class


【解决方案1】:

这两个都是匿名类。除了范围没有太大区别。但下面是一个链接,可用于决定使用哪个 本地类: 匿名类: 嵌套类: 拉姆达表达式: http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html

希望对你有帮助。

【讨论】:

    【解决方案2】:

    它们都是匿名类。在第一个中,您可以重用它,但两者都只是创建的对象。匿名类必然是内部类,并且可以访问封闭类的任何字段。

    我认为您可能会将匿名类与 inner classes and static nested classes 混淆,它们有明显的区别。

    【讨论】:

      【解决方案3】:

      两者都是匿名类。以侦听器为例,如果您打算为两个组件使用相同的侦听器,则可以为其创建一个实例变量,否则您可以直接将其附加到组件上。所以这取决于要求。

      但主要是一种一次性使用,也就是说,您避免为此创建实例。如果您打算重用它,最好为此创建一个单独的类。

      【讨论】:

        【解决方案4】:

        两者都是匿名类。匿名类是一个构造函数 (new ClassName()),后跟一个类主体 ({...})。

        【讨论】:

          【解决方案5】:

          在您的示例中,在这两种情况下,您都创建了匿名内部类。它“new OnClickListener() {”我认为它没有开销,因为它在编译时得到解决。人们一直在使用它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-06-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-23
            相关资源
            最近更新 更多