Java本地类的优势

Java本地类的优势,java,oop,class,local,Java,Oop,Class,Local,Java或任何其他语言中使用此功能的本地类的优点是什么?它们允许您从父类中提取逻辑并将其对象化。这将从不属于它的地方删除功能,并将其放入自己的类中。但是,如果这个新对象只需要很短的时间,只需要一段代码,那该怎么办呢?这就是本地类的适用范围。下面是一个示例,说明了匿名内部类、本地内部类和常规内部类如何出现在程序中。该示例查看myMethod方法和MyClass类中存在的InnerClass类。为了便于讨论,这些类都将实现Runnable接口: public class MyClass {

Java或任何其他语言中使用此功能的本地类的优点是什么?

它们允许您从父类中提取逻辑并将其对象化。这将从不属于它的地方删除功能,并将其放入自己的类中。但是,如果这个新对象只需要很短的时间,只需要一段代码,那该怎么办呢?这就是本地类的适用范围。

下面是一个示例,说明了匿名内部类、本地内部类和常规内部类如何出现在程序中。该示例查看
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不同),因为它们有名称,可以重复使用。另外,第三点是好的。