我正在重构一个面向公众界面的课程,并考虑使用方法让我问:
在某个较大的类(作为实例变量)中声明以下内容之间有什么区别:
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中读到了一个匿名内部类
是在另一个类'方法
的主体内创建和定义的
我给出的第一个例子是在另一个类的主体内创建和定义的,但不在另一个类的方法中,因为第二个是。它仍然是一个匿名的内部阶级?此外,一个人与另一个人接受的做法是什么?声明(我认为仍然是)匿名内部类作为实例变量是否更有效,因为不需要重新创建新对象?
答案 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(){”我认为它在编译时得到解决后没有开销。人们一直都在使用它。