En Java, les classes imbriquées peuvent être l'une static
ou l' autre . S'ils le sont static
, ils ne contiennent pas de référence au pointeur de l'instance contenant (ils ne sont plus appelés classes internes, ils sont appelés classes imbriquées).
Oublier de créer une classe imbriquée static
alors qu'elle n'a pas besoin de cette référence peut entraîner des problèmes de récupération de place ou d'analyse d'échappement.
Est-il possible de créer également une classe interne anonyme static
? Ou le compilateur le comprend-il automatiquement (ce qu'il pourrait, car il ne peut pas y avoir de sous-classes)?
Par exemple, si je fais 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());
}
}
java
syntax
inner-classes
Thilo
la source
la source
Collections.sort(list, String.CASE_INSENSITIVE_ORDER)
fonctionne depuis Java 2, lire, puisque l'API Collection existe…Réponses:
Non, vous ne pouvez pas, et non, le compilateur ne peut pas le comprendre. C'est pourquoi FindBugs suggère toujours de changer les classes internes anonymes en classes
static
imbriquées nommées si elles n'utilisent pas leurthis
référence implicite .Edit: Tom Hawtin - tackline dit que si la classe anonyme est créée dans un contexte statique (par exemple dans la
main
méthode), la classe anonyme l'est en faitstatic
. Mais le JLS n'est pas d'accord :Le glossaire Java de Roedy Green dit que le fait que les classes anonymes soient autorisées dans un contexte statique dépend de l'implémentation:
Edit 2: Le JLS couvre en fait les contextes statiques plus explicitement au §15.9.2 :
Ainsi, une classe anonyme dans un contexte statique équivaut à peu près à une
static
classe imbriquée en ce qu'elle ne garde pas de référence à la classe englobante, même si ce n'est techniquement pas unestatic
classe.la source
true
utilisant javac (sun-jdk-1.7.0_10) et enfalse
utilisant le compilateur Eclipse.En quelque sorte. Une classe interne anonyme créée dans une méthode statique sera évidemment effectivement statique car il n'y a pas de source pour un this externe.
Il existe des différences techniques entre les classes internes dans les contextes statiques et les classes imbriquées statiques. Si vous êtes intéressé, lisez le JLS 3rd Ed.
la source
Je pense qu'il y a un peu de confusion dans la nomenclature ici, qui est certes trop stupide et déroutante.
Quel que soit votre nom, ces modèles (et quelques variantes avec une visibilité différente) sont tous possibles, normaux et légaux en Java:
Ils sont pris en compte dans la spécification du langage (si vous êtes vraiment dérangé, voyez la section 15.9.5.1 pour celle à l'intérieur de la méthode statique).
Mais cette citation est tout simplement fausse :
Je pense que l'auteur cité confond le mot-clé statique avec le contexte statique . (Certes, le JLS est également un peu déroutant à cet égard.)
Honnêtement, tous les modèles ci-dessus sont bons (peu importe ce que vous les appelez "imbriqué", "intérieur", "anonyme" ...). Vraiment, personne ne supprimera soudainement cette fonctionnalité dans la prochaine version de Java. Honnêtement!
la source
new
etJComponent
dans votre troisième exemple.Les classes internes ne peuvent pas être statiques - une classe imbriquée statique n'est pas une classe interne. Le tutoriel Java en parle ici .
la source
les classes internes anonymes ne sont jamais statiques (elles ne peuvent pas déclarer de méthodes statiques ou de champs statiques non finaux), mais si elles sont définies dans un contexte statique (méthode statique ou champ statique), elles se comportent comme statiques dans le sens où elles ne peuvent pas accéder aux membres non statiques (c.-à-d. instance) de la classe englobante (comme tout le reste à partir d'un contexte statique)
la source
Sur la note de rendre statique une classe interne anonyme en les appelant dans une méthode statique.
Cela ne supprime pas réellement la référence. Vous pouvez tester cela en essayant de sérialiser la classe anonyme et en ne rendant pas la classe englobante sérialisable.
la source