2012-10-22 36 views
4

假設以下情形:Java - 匿名對象需要多少空間?

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

多少空間,匿名對象採取?我知道每個匿名obj對象都有一個指向其方法查找表中的相同實現run的指針。

+2

它需要一些空間,爲什麼你想知道它? –

回答

5

Runnable的源代碼沒有指定任何字段,所以匿名類將不會佔用比Object更多的空間,但有兩點不同。內部類對外部類實例有一個隱式引用,因此您可能需要考慮這個因素。它還會從外部類中引用final變量的副本。

4

匿名類佔用與非匿名類相同數量的空間。所有對象都保持對它們是實例的類的引用。

只有約一個匿名類不同的是,它會包含對

  • 外類實例
  • 使用任何最終變量的副本的引用。
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;匿名對象的每個實例都將獲得這些變量的副本。

0

使用事件探查器檢查班級實例的大小。由於沒有屬性,它非常小 - 它和java.lang.Object的實例一樣大。它取決於JVM版本。

如果您需要進行此比較有效只是做:

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

}

但是我不會理會這個太多,因爲這一點。