本地类Java的优势
Java中的本地类或使用此function的任何其他语言的优势是什么?
它们允许您从父类中取出逻辑并将其客观化。 这将从不属于的地方删除function并将其放入自己的类中。 但是,如果这个新对象仅在短时间内需要,仅在单个代码块的持续时间内怎么办? 嗯,这就是本地class级适合的地方。
这是一个如何在程序中出现匿名内部类,本地内部类和常规内部类的示例。 该示例查看myMethod
方法和MyClass
类中的InnerClass
类。 为了便于讨论,这些类都将实现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
的类,而不必实际编写类并命名它,并且正如他在post中提到的krosenvold一样 ,它被用作Java中的“穷人关闭”。
例如,使用匿名内部类启动Thread
一种非常简单的方法是:
new Thread(new Runnable() { public void run() { // do stuff } }).start();
本地内部类可用于创建本地范围内的类 – 无法从myMethod
之外的其他方法访问它。
如果有另一个方法,我们试图创建一个位于myMethod
方法内的LocalClass
实例,我们将无法这样做:
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(); }
关于匿名内部类和本地内部类的另一个问题是,它将能够访问在myMethod
中声明的final
变量:
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
变量,同时,类是本地的方法本身,因此无法从外部类和同一类中的其他方法访问它。
您可以使用匿名内部类无法获得的本地类可以执行许多操作。
- 因为类型有一个名称,您可以更有用地添加不在超类型中的成员
- 给定的名称可以使堆栈跟踪更容易遵循(特别是对于锁定对象)
- 子类型多个基本类型
- 在多个地方构建,以及多个构造函数
另一方面,他们使一些可怕的冗长语法更加混乱。