本地类Java的优势

时间:2009-01-26 03:46:42

标签: java oop class local

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

3 个答案:

答案 0 :(得分:25)

这是一个如何在程序中出现匿名内部类,本地内部类和常规内部类的示例。该示例查看myMethod类中存在的InnerClass方法和MyClass类。为了便于讨论,这些类都将实现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的类,而不必实际写出类并命名它,并且提到krosenvold在他的帖子中,它被用作Java中的“穷人关闭”。

例如,使用匿名内部类启动Thread的一种非常简单的方法是:

new Thread(new Runnable() {
    public void run()
    {
        // do stuff
    }
}).start();

本地内部类可用于创建本地范围内的类 - 无法从myMethod之外的其他方法访问它。< / p>

如果有其他方法,我们尝试制作位于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可以通过{{1}从其他类访问}。当然,这也意味着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 } } // ... // 变量,同时,类是方法本身的本地类,因此无法从外部类和同一类中的其他方法访问它。

答案 1 :(得分:14)

使用匿名内部类可以使用本地类可以执行许多操作。

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

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

答案 2 :(得分:12)

它们允许您从父类中取出逻辑并将其客观化。这将从不属于的地方删除功能并将其放入自己的类中。但是,如果这个新对象仅在短时间内需要,仅在单个代码块的持续时间内怎么办?嗯,这就是本地班级适合的地方。