匿名内部类:声明为实例变量与动态创建

时间:2013-03-21 20:10:43

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

我正在重构一个面向公众界面的课程,并考虑使用方法让我问:

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

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中读到了一个匿名内部类

  

是在另一个类'方法

的主体内创建和定义的

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

5 个答案:

答案 0 :(得分:2)

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

我希望它有所帮助。

答案 1 :(得分:1)

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

我认为你可能会收到与inner classes and static nested classes混淆的匿名课程,这些课程有明显的不同。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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