Java - сколько места занимает анонимный объект?

предполагая следующий сценарий:

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

сколько места займет анонимный объект? Я понимаю, что каждый анонимный объект obj будет иметь указатель на ту же реализацию run в своей таблице поиска методов.


person Bober02    schedule 22.10.2012    source источник
comment
это займет немного места, почему именно вы хотите это знать?   -  person Denis Tulskiy    schedule 22.10.2012


Ответы (4)


В исходном коде Runnable не указаны поля. , поэтому анонимный класс не займет больше места, чем Object, с двумя отличиями. Внутренний класс имеет неявную ссылку на экземпляр внешнего класса, поэтому вам следует учесть это обстоятельство. Он также будет принимать копии final переменных, на которые ссылается внешний класс.

person Brian Agnew    schedule 22.10.2012

Анонимный класс занимает примерно столько же места, что и неанонимный класс. Все объекты сохраняют ссылку на класс, экземпляром которого они являются.

Единственное отличие анонимного класса в том, что он будет содержать ссылку на

  • экземпляр внешнего класса
  • копия всех используемых конечных переменных.
person Peter Lawrey    schedule 22.10.2012

Все экземпляры 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
         }
    });
}

резервирует место в объекте для хранения value1, value2 и this; каждый экземпляр анонимного объекта получит копию этих переменных.

person Sergey Kalinichenko    schedule 22.10.2012

Используйте профилировщик, чтобы проверить размер экземпляра вашего класса. Он довольно маленький, так как у него нет свойств - он такой же большой, как экземпляр java.lang.Object. Это зависит от версии JVM.

Если вам нужно сделать это более эффективным, просто сделайте:

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

}

Однако я не буду особо об этом беспокоиться.

person Piotr Gwiazda    schedule 22.10.2012