Pertanyaan Java - berapa banyak ruang yang diambil objek anonim?


misalkan skenario berikut:

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

berapa banyak ruang yang akan diambil objek anonim? Saya mengerti bahwa setiap objek anonim obj akan memiliki pointer ke implementasi yang sama run dalam tabel pencarian metode.


4
2017-10-22 13:17


asal


Jawaban:


Kode sumber dari Dapat dijalankan tidak menentukan bidang apa pun, sehingga kelas anonim tidak akan mengambil ruang lebih dari satu Object, dengan dua perbedaan. Kelas batin memiliki referensi implisit ke instance kelas luar, jadi Anda ingin memasukkan faktor ini. Ini juga akan mengambil salinan final variabel yang direferensikan dari kelas luar.


5
2017-10-22 13:23



Kelas anonim menghabiskan banyak ruang yang sama dengan kelas non-anonim. Semua objek menyimpan referensi ke kelas yang merupakan turunannya.

Satu-satunya hal yang berbeda tentang kelas anonim adalah bahwa itu akan berisi referensi

  • contoh kelas luar
  • salinan variabel final yang digunakan.

4
2017-10-22 13:21



Semua contoh dari run memang akan berbagi "pointer" yang sama ke tabel pencarian metode. Namun, ukuran yang tepat dari objek tergantung pada konten run dan ... diatasnya. Kelas anonim yang dihasilkan kompilator menyediakan ruang untuk menyimpan variabel yang direferensikan oleh run metode, selain ruang untuk menyimpan referensi ke this objek kelas melampirkan.

Sebagai contoh,

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
         }
    });
}

menyimpan ruang di objek untuk disimpan value1, value2, dan this; setiap contoh dari objek anonim akan mendapatkan salinan variabel-variabel ini.


1
2017-10-22 13:22



Gunakan profiler untuk memeriksa ukuran instance kelas Anda. Ini agak kecil karena tidak ada properti - itu hanya sebesar contoh java.lang.Object. Itu tergantung pada versi JVM.

Jika Anda perlu membuat ini lebih efisien, lakukan saja:

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

}

Namun saya tidak akan terlalu memikirkan hal ini.


0
2017-10-22 13:24