Къде се съхраняват крайните локални променливи на Java?

Вземете следния пример:

public void init() {
    final Environment env = new Environment();
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
             env.close();
        }
     });
}

Първо, къде се съхранява env? Така ли:

  • копиран от компилатора в скрита членска променлива на вътрешния клас, който го препраща
  • копиран в и препратен към купчината
  • оставен в стека и по някакъв начин препратен там
  • нещо друго

Моето предположение е първата опция.

Второ, отстранете всички проблеми с производителността, които възникват от това (вместо просто да създавате env като членска променлива на класа и да я препращате като такава), особено ако създавате голям брой такива вътрешни класови конструкции, които препращат към крайни локални променливи.


person Joel    schedule 22.12.2009    source източник


Отговори (1)


Да, те се копират, поради което трябва да декларирате променливата като final. По този начин е гарантирано, че те няма да се променят след направата на копието.

Това е различно например от полета, които са достъпни дори и да не са крайни. В този случай вътрешният клас получава препратка към външната инстанция, която използва за тази цел.

private Environment env;  // a field does not have to be final

public void init() {
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
             env.close();
        }
     });
}

Второ, има ли някакви проблеми с производителността, които възникват от това?

В сравнение с какво? Трябва да имате полето или променливата наоколо, за да работи вътрешният ви клас, а копието е много ефективен начин. Така или иначе това е само "плитко" копие: копира се само препратката към (във вашия пример) среда, а не самата среда.

person Thilo    schedule 22.12.2009
comment
Така че мога ли да приема, че няма проблеми с производителността, които възникват от това? - person Joel; 22.12.2009
comment
Моето лично недоволство в тази област е, че препратките към външната инстанция (използвана за достъп до полета, а не променливи, които се копират) може да са проблем, ако не са необходими: stackoverflow.com/questions/ 758570/ - person Thilo; 22.12.2009
comment
в сравнение с реферирането му като членска променлива. Ако е копиран, тогава моето предположение е, че няма последици за производителността. - person Joel; 22.12.2009
comment
да, същото е (само по-малко писане), тъй като вие сте зад кулисите, всъщност препращайки към синтетична членска променлива, която компилаторът е създал за вас във вътрешния клас, за да съхранява копието на крайната променлива. - person Thilo; 22.12.2009
comment
ще получите моята подкрепа, ако добавите препратка или работа, която ви е накарала да повярвате в това. - person David Waters; 22.12.2009