26

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

4

3 回答 3

31

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

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声明它们的方法中的变量,同时,这些类对于方法本身,因此不能从外部类和同一类中的其他方法访问它。

于 2009-01-26T05:45:14.697 回答
15

使用本地类可以做很多匿名内部类无法做到的事情。

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

另一方面,它们使一些极其冗长的语法变得更加混乱。

于 2009-01-26T14:22:45.497 回答
13

它们允许您从父类中取出逻辑并将其对象化。这会从它不属于的地方删除功能并将其放入自己的类中。但是如果这个新对象只需要很短的时间,只需要一个代码块的持续时间呢?嗯,这就是本地类适合的地方。

于 2009-01-26T03:58:33.977 回答