En Java, les classes imbriquées peuvent être soit static
ou non. S'ils le sont static
elles ne contiennent pas de référence au pointeur de l'instance qui les contient (elles ne sont pas non plus appelées classes internes, mais classes imbriquées).
Oublier de faire une classe imbriquée static
alors qu'il n'a pas besoin de cette référence peut conduire à des problèmes de garbage collection ou d'analyse d'échappement.
Est-il possible de créer une classe interne anonyme static
également ? Ou bien le compilateur s'en rend-il compte automatiquement (ce qui est possible, puisqu'il ne peut y avoir de sous-classes) ?
Par exemple, si je crée un comparateur anonyme, je n'ai presque jamais besoin de la référence à l'extérieur :
Collections.sort(list, new Comparator<String>(){
int compare(String a, String b){
return a.toUpperCase().compareTo(b.toUpperCase());
}
}
0 votes
Quels sont les problèmes de "garbage collection ou escape analysis" lorsqu'on oublie de rendre une classe interne statique ? Je pensais qu'il s'agissait uniquement de performances...
17 votes
L'instance de votre classe interne conserve une référence à son instance externe, même si vous n'en avez pas besoin. Cela permet d'éviter la collecte de déchets. Imaginez un objet usine (lourd en ressources) qui crée des instances légères de quelque chose. Une fois que la fabrique a fait son travail (par exemple, pendant le démarrage de l'application), elle pourrait être éliminée, mais cela ne fonctionne que si les choses qu'elle a créées ne sont pas liées.
0 votes
Je sais, ce n'est qu'un exemple, mais comme c'est un exemple récurrent, il faut mentionner que
Collections.sort(list, String.CASE_INSENSITIVE_ORDER)
fonctionne depuis Java 2, lire, depuis que l'API Collection existe