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匿名内部クラスとローカル内部クラスに関するもう 1 つの点は、次のように宣言されている変数にアクセスできること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 に答える