Java本地类的优势
Java或任何其他语言中使用此功能的本地类的优点是什么?它们允许您从父类中提取逻辑并将其对象化。这将从不属于它的地方删除功能,并将其放入自己的类中。但是,如果这个新对象只需要很短的时间,只需要一段代码,那该怎么办呢?这就是本地类的适用范围。下面是一个示例,说明了匿名内部类、本地内部类和常规内部类如何出现在程序中。该示例查看Java本地类的优势,java,oop,class,local,Java,Oop,Class,Local,Java或任何其他语言中使用此功能的本地类的优点是什么?它们允许您从父类中提取逻辑并将其对象化。这将从不属于它的地方删除功能,并将其放入自己的类中。但是,如果这个新对象只需要很短的时间,只需要一段代码,那该怎么办呢?这就是本地类的适用范围。下面是一个示例,说明了匿名内部类、本地内部类和常规内部类如何出现在程序中。该示例查看myMethod方法和MyClass类中存在的InnerClass类。为了便于讨论,这些类都将实现Runnable接口: public class MyClass {
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() {}
}
}
匿名内部类可以简单地用来创建一个实现可运行的类,而不需要实际编写类并命名,正如他在文章中提到的,它在Java中被用作“穷人的闭包”
例如,使用匿名内部类启动线程的一种非常简单的方法是:
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();
}
内部类是内部类所在类的一部分。因此,例如,MyClass.InnerClass
可以从其他类访问内部类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
变量,同时,这些类是方法本身的局部类,因此,不能从外部类和同一类中的其他方法访问它。可以使用匿名内部类无法获得的本地类执行许多操作
- 因为类型有名称,所以可以更有效地添加不在超类型中的成员
- 给定的名称可以使堆栈跟踪更易于跟踪(特别是对于锁定对象)
- 子类型多个基类型
- 在多个位置构造,以及多个构造函数
另一方面,它们使一些极其冗长的语法更加混乱。与其说是对象实例的持续时间,不如说是对象实例的范围。如果该类只需要对父类可见,那么将其设置为本地将阻止它在其他地方使用。此外,本地类可以看到父类的私有成员-非本地类不能这样做。@belugabob:1。局部类只能在定义它们的方法或构造函数内部使用。它们甚至对封闭类都不可见。2.嵌套/内部类也可以看到封闭类的私有变量。#2和#3是我个人使用它们的唯一原因。(如果与#1不同),因为它们有名称,可以重复使用。另外,第三点是好的。