4

次のシナリオを想定します。

void thisIsCalledManyTimes(){
    // ....
    someObject.executeIfNecessary( new Runnable(){
         void run(){ //do sth here}
    });
}

匿名オブジェクトはどのくらいのスペースを必要としますか? run各オブジェクトの無名 obj は、そのメソッド ルックアップ テーブルにの同じ実装へのポインタを持つことを理解しています。

4

4 に答える 4

5

Runnableのソース コードではフィールドが指定されていないため、匿名クラスは より多くのスペースを必要としませんが、Object2 つの違いがあります。内部クラスには外部クラスのインスタンスへの暗黙的な参照があるため、これを考慮に入れる必要があります。またfinal、外部クラスから参照される変数のコピーも取得します。

于 2012-10-22T13:23:22.017 に答える
4

匿名クラスは、非匿名クラスとほぼ同じ量のスペースを占有します。すべてのオブジェクトは、インスタンスであるクラスへの参照を保持します。

匿名クラスの唯一の違いは、への参照が含まれることです。

  • 外部クラスのインスタンス
  • 使用される最終変数のコピー。
于 2012-10-22T13:21:57.040 に答える
1

のすべてのインスタンスはrun、メソッド ルックアップ テーブルへの同じ「ポインタ」を共有します。ただし、オブジェクトの正確なサイズは、runおよびその...上の の内容によって異なります。コンパイラが生成する無名クラスは、runメソッドによって参照される変数を格納するためのスペースを提供します。またthis、外側のクラスのオブジェクトへの参照を格納するためのスペースも提供します。

例えば、

private String name;

void thisIsCalledManyTimes(){
    final int value1 = 123;
    final double value2 = 456.789.
    someObject.executeIfNecessary( new Runnable(){
         void run(){
             System.out.println(name);   // Referenced through the enclosing "this"
             System.out.println(value1); // Variable will be inserted by the compiler
             System.out.println(value2); // Variable will be inserted by the compiler
         }
    });
}

value1value2、およびを格納するためにオブジェクト内のスペースを予約しますthis。匿名オブジェクトの各インスタンスは、これらの変数のコピーを取得します。

于 2012-10-22T13:22:03.787 に答える
0

クラスのインスタンスのサイズを確認するには、プロファイラーを使用します。プロパティがないためかなり小さく、java.lang.Object のインスタンスと同じくらいの大きさです。JVMのバージョンによって異なります。

これをより効率的にする必要がある場合は、次のようにします。

void thisIsCalledManyTimes(){
// ....
   if (someObject.isItNecessary()) {
     someObject.execute( new Runnable(){
         void run(){ //do sth here}
     });
   } 

}

しかし、私はこれについてあまり気にしません。

于 2012-10-22T13:24:54.747 に答える