2009-12-22 8 views
18

Prenons l'exemple suivant:Où sont stockées les variables locales finales Java?

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

Tout d'abord, où est stocké env? Est-ce:

  • copié par le compilateur dans une variable membre cachée de la classe interne qui y fait référence
  • copié et référencé sur le tas
  • à gauche sur la pile et en quelque sorte il
  • référencé
  • autre chose

Mon estimation est la première option. Ensuite, faites les problèmes de performance qui en découlent (plutôt que de simplement créer env en tant que variable membre de la classe et en la référençant comme telle) en particulier si vous créez un grand nombre de ces constructions de classe interne qui référencent le local final. variables

Répondre

18

Oui, ils sont copiés, c'est pourquoi vous devez déclarer la variable comme finale. De cette façon, ils sont garantis de ne pas changer après la copie a été faite. Ceci est différent pour les champs d'instance, qui sont accessibles même si ce n'est pas définitif. Dans ce cas, la classe interne obtient une référence à l'instance externe qu'elle utilise à cette fin.

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

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

Deuxièmement, faire des problèmes de performance qui découlent de le faire?

Par rapport à quoi? Vous devez avoir le champ ou la variable autour de votre classe interne pour travailler, et une copie est un moyen très efficace. Ce n'est qu'une copie "superficielle" de toute façon: juste la référence à l'environnement (dans votre exemple) est copiée, pas l'environnement lui-même.

+0

Alors, est-ce que je peux supposer qu'il n'y a aucun problème de performance qui en résulte? – Joel

+0

Mon bogue personnel dans ce domaine est que les références à l'instance externe (utilisées pour accéder aux champs, pas aux variables, qui sont copiées) peuvent poser problème, si elles ne sont pas nécessaires: http://stackoverflow.com/questions/ 758570/is-it-it-to-anonymous-inner-classes-in-java-static – Thilo

+0

par rapport à la référence en tant que variable membre. Si c'est copié, alors, mon hypothèse est qu'il n'y a aucune implication de performance. – Joel