13

これは、このスレッドで提供されている質問に対する私の回答に関連しています:内側のクラスは軽量ですか?

私の読書から覚えているのは、単一の匿名内部クラスから 1 つのオブジェクトしか作成できない場合、このため、ActionListenerクラスを作成し、この 1 つのクラスから (リフレクションを使用せずに) 複数のオブジェクトを作成したい場合は、匿名の内部クラスを使用するのではなく、プライベートな内部クラスまたはスタンド アロング クラスのいずれかを使用しますが、人々は私が間違っていると言っています。誰かが私のためにこれを明確にしてもらえますか? 詳細はリンク先に記載しておりますので、ご確認くださいませ。

4

2 に答える 2

17

任意の数の匿名クラス オブジェクトを作成でき、コード内の 1 か所に作成できます (コードをコピーしない限り)。

ExecutorService service = ...
for(int i=0;i<1000*1000;i++) {
   final int finalI = i;
   service.submit(new Runnable() {
      public void run() {
         System.out.println("Task "+finalI+" run.");
      }
   });
}

このコードは、同じクラスの 100 万個のオブジェクトを作成します。

于 2011-01-27T18:06:03.540 に答える
4

私にはわかりません。仕様をくまなく調べると、内部クラスを通常のクラスと同じように扱うべきであるという証拠が見つかるかもしれません。ただし、精神的には、内部クラスは外部インスタンスに依存し、クラスはインスタンスを超えて存在しません。これは、存在が基本的に永続的な「通常の」クラスとは異なります。もちろん、2 つの外部インスタンスの 2 つの内部クラスは、同じソース コードで作成されているため、ある程度相互に関連していますが、それはそれらが同一または同等である必要があるという意味ではありません。

Java 設計者がこのように意図した証拠があり、内部クラスの精神は外部インスタンスのスコープ内に存在します。たとえば、奇妙な構文outerInstance.new InnerClass(). たとえば、静的変数はなく、内部クラスの静的初期化子もありません。クラスのアンロード [1] の議論では、この議論は実際には内部クラスには当てはまらないことがわかります。内部クラスはアンロードできると考えられます! VM が新しい外部インスタンスごとに新しい内部クラスを作成することが考えられます。

実際にはそうではなく、内部クラスは通常のクラスと同じように扱われます。しかし、概念的には、インスタンス プライベート クラスとして常に別の方法で考えます。

[1] http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.7

更新: [2] によると

2 つの参照型は、... 同じバイナリ名を持っている場合、同じランタイム型です

[3]

匿名クラス (§15.9.5) のバイナリ名は、すぐ外側の型のバイナリ名、$、空でない一連の数字で構成されます。

したがって、1 つの匿名クラスには 1 つのバイナリ名があるため、実行時の型は 1 つだけです。仕様は、匿名クラスの異なるインスタンスが同一のクラスを持つことを保証します。

[2] http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.4

[3] http://java.sun.com/docs/books/jls/third_edition/html/binaryComp.html#44909

于 2011-01-27T21:14:04.940 に答える