ProgrammationDéveloppeur Backend

Comment fonctionnent les types de classes imbriquées en Java (static et non-static), dans quels cas utiliser chacune d'elles, et quels pièges sont associés à leur mise en œuvre ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

En Java, il existe quatre types de classes imbriquées :

  • Classes imbriquées statiques (static nested class);
  • Classes internes (inner class, non-static);
  • Classes locales (local class, déclarées à l'intérieur des méthodes);
  • Classes internes anonymes.

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 piège.

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.

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet.


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.