使用此功能的Java或其他任何语言的本地类有什么优势?
答案 0 :(得分:25)
这是一个如何在程序中出现匿名内部类,本地内部类和常规内部类的示例。该示例查看myMethod
类中存在的InnerClass
方法和MyClass
类。为了便于讨论,这些类都将实现Runnable
接口:
public class MyClass
{
public void myMethod()
{
// Anonymous inner class
Runnable r = new Runnable() {
public void run() {}
};
// Local inner class
class LocalClass implements Runnable
{
public void run() {}
}
}
// ... //
// Inner class
class InnerClass implements Runnable
{
public void run() {}
}
}
匿名内部类可以用来简单地创建一个实现Runnable
的类,而不必实际写出类并命名它,并且提到krosenvold在他的帖子中,它被用作Java中的“穷人关闭”。
例如,使用匿名内部类启动Thread
的一种非常简单的方法是:
new Thread(new Runnable() {
public void run()
{
// do stuff
}
}).start();
本地内部类可用于创建本地范围内的类 - 无法从myMethod
之外的其他方法访问它。< / p>
如果有其他方法,我们尝试制作位于LocalClass
方法内的myMethod
的实例,我们将无法执行此操作:
public void anotherMethod()
{
// LocalClass is out of scope, so it won't be found,
// therefore can't instantiate.
new Thread(new LocalClass()).start();
}
内部类是内部类所在类的一部分。例如,内部类InnerClass
可以通过{{1}从其他类访问}。当然,这也意味着MyClass.InnerClass
中的另一个方法也可以实例化一个内部类。
MyClass
关于匿名内部类和本地内部类的另一个问题是,它将能够访问public void anotherMethod()
{
// InnerClass is part of this MyClass. Perfectly instantiable.
new Thread(new InnerClass()).start();
}
中声明的final
变量:
myMethod
那么,有什么优势?使用匿名内部类和本地内部类而不是具有单独的完整内部类或类将允许前者在声明它们的方法中访问public void myMethod()
{
// Variable to access from anonymous and local inner classes.
final int myNumber = 42;
// Anonymous inner class
Runnable r = new Runnable() {
public void run()
{
System.out.println(myNumber); // Works
}
};
// Local inner class
class LocalClass implements Runnable
{
public void run()
{
System.out.println(myNumber); // Works
}
}
// ... //
变量,同时,类是方法本身的本地类,因此无法从外部类和同一类中的其他方法访问它。
答案 1 :(得分:14)
使用匿名内部类可以使用本地类可以执行许多操作。
另一方面,他们使一些可怕的冗长语法更加混乱。
答案 2 :(得分:12)
它们允许您从父类中取出逻辑并将其客观化。这将从不属于的地方删除功能并将其放入自己的类中。但是,如果这个新对象仅在短时间内需要,仅在单个代码块的持续时间内怎么办?嗯,这就是本地班级适合的地方。