En Java, il existe quatre types de classes imbriquées :
Static nested class n'a pas accès aux membres non statiques de la classe externe directement. Elle est compilée comme une classe séparée, ses instances ne conservent pas de référence cachée à l'objet enveloppant.
Inner class (non-static) conserve une référence implicite à l'objet externe et peut accéder à ses champs. Ce type de classe est souvent utilisé pour la mise en œuvre de listeners ou d'itérateurs ayant accès aux données de l'objet externe.
class Outer { static class Nested { // static void foo() {} } class Inner { // non-static void bar() { System.out.println(value); // accès au champ externe } } int value = 42; }
Utilisez static nested class pour des utilitaires ou des constructeurs auxiliaires, liés à la classe externe par le sens, mais ne nécessitant pas d'accès à son état. Utilisez inner class si un accès direct aux membres non statiques de la classe externe est nécessaire pour une intégration plus étroite.
Question : "Est-ce qu'une static nested class peut accéder directement aux champs non statiques d'une instance de la classe externe ?"
Réponse : Non, la static nested class ne peut pas accéder directement aux champs ou méthodes non statiques d'une instance de la classe externe, car elle ne contient pas (et ne conserve pas) de référence à l'objet de la classe externe.
Histoire
Dans une bibliothèque de stockage de données en cache, nous avons utilisé static nested class, en supposant qu'il était possible d'accéder aux paramètres de configuration de la classe externe. Après avoir tenté d'accéder, une erreur de compilation s'est produite - la classe interne ne voyait pas les champs non statiques, il a donc fallu changer l'architecture.
Histoire
Dans l'interface d'une application graphique, nous avons utilisé inner class au lieu de static nested class pour des constantes, ce qui a entraîné une référence implicite non nécessaire à l'objet externe. En conséquence, le collecteur de déchets ne pouvait pas nettoyer correctement la mémoire, entraînant des fuites.
Histoire
Lors de la sérialisation d'une collection contenant des classes internes, un problème est survenu : inner class conservait une référence à l'objet parent, et lors de la sérialisation, l'ensemble de l'arbre de dépendances était sérialisé, ralentissant fortement le processus et augmentant la taille du résultat. Après un changement vers static nested class, le problème a disparu.