0

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

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

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
        }
    });
}

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

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

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

4

5 回答 5

2

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

我希望它有所帮助。

于 2013-03-21T20:19:21.507 回答
1

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

我认为您可能会将匿名类与内部类和静态嵌套类混淆,它们有明显的区别。

于 2013-03-21T20:14:27.673 回答
0

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

于 2013-03-21T20:15:48.310 回答
0

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

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

于 2013-03-21T20:13:57.387 回答
0

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

于 2013-03-21T20:14:19.567 回答