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() {} } }
该匿名内部类可以用来简单地做一个实现的类Runnable
,而不必实际写出来的类,并将其命名,并作为krosenvold在他的文章中提到,它是作为一个在Java中"穷人的关闭".
例如,开始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
在声明它们的方法中访问变量,同时,类是本地的方法本身,因此无法从外部类和同一类中的其他方法访问它.
您可以使用匿名内部类无法获得的本地类可以执行许多操作.
因为类型有一个名称,您可以更有用地添加不在超类型中的成员
给定名称可以使堆栈跟踪更容易遵循(特别是对于锁定对象)
子类型多个基类型
在多个地方构建,以及多个构造函数
另一方面,他们使一些可怕的冗长语法更加混乱.
它们允许您从父类中取出逻辑并将其客观化.这将从不属于的地方删除功能并将其放入自己的类中.但是,如果这个新对象仅在短时间内需要,仅在单个代码块的持续时间内怎么办?嗯,这就是本地班级适合的地方.