本地类 Java 的优势

2022-09-01 15:17:07

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


答案 1

下面是一个示例,说明程序中可能存在匿名内部类、本地内部类和常规内部类。该示例正在查看类中存在的方法和类。为了便于讨论,这些类都将实现接口:myMethodInnerClassMyClassRunnable

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

如果有另一种方法,并且我们尝试创建位于该方法内部的实例,我们将无法执行此操作:LocalClassmyMethod

public void anotherMethod()
{
    // LocalClass is out of scope, so it won't be found,
    // therefore can't instantiate.
    new Thread(new LocalClass()).start();
}

内部类是内部类所在的类的一部分。因此,例如,内部类可以通过 从其他类访问。当然,这也意味着 中的另一种方法也可以实例化内部类。InnerClassMyClass.InnerClassMyClass

public void anotherMethod()
{
    // InnerClass is part of this MyClass. Perfectly instantiable.
    new Thread(new InnerClass()).start();
}

关于匿名内部类和局部内部类的另一件事是,它将能够访问在中声明的变量:finalmyMethod

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


答案 2

您可以使用本地类执行许多操作,而匿名内部类则无法做到这一点。

  • 因为类型有一个名称,所以你可以更有用地添加不在超类型中的成员
  • 给定的名称可以使堆栈跟踪更易于跟踪(特别是对于锁定对象)
  • 子类型多个基本类型
  • 在多个位置和多个构造函数中构造

另一方面,它们使一些可怕的冗长语法更加混乱。