本地类 Java 的优势
在Java或任何其他使用此功能的语言中,本地类的优势是什么?
下面是一个示例,说明程序中可能存在匿名内部类、本地内部类和常规内部类。该示例正在查看类中存在的方法和类。为了便于讨论,这些类都将实现接口: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() {}
}
}
匿名内部类可以用来简单地创建一个实现的类,而不必实际写出类并命名它,正如krosenvold在他的帖子中提到的,它在Java中被用作“穷人的闭包”。Runnable
例如,开始使用匿名内部类的一种非常非常简单的方法是:Thread
new Thread(new Runnable() {
public void run()
{
// do stuff
}
}).start();
本地内部类可用于创建位于本地作用域内的类 -- 无法从 以外的其他方法访问它。myMethod
如果有另一种方法,并且我们尝试创建位于该方法内部的实例,我们将无法执行此操作: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
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
}
}
// ... //
那么,有哪些优势呢?使用匿名内部类和本地内部类而不是单独的完整内部类或类将允许前者访问声明它们的方法中的变量,同时,这些类是方法本身的本地,因此无法从外部类和同一类中的其他方法访问它。final
您可以使用本地类执行许多操作,而匿名内部类则无法做到这一点。
另一方面,它们使一些可怕的冗长语法更加混乱。