Choisir la bonne stratégie d’imbrication
Choisissez entre les variantes de classes imbriquées en fonction du couplage, des besoins d’accès et de la lisibilité.
Choisir la bonne stratégie d’imbrication est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.
Choisir la bonne stratégie d’imbrication
Java propose quatre possibilités d’imbrication : niveau supérieur, classe imbriquée statique, classe interne (non statique) et classe locale ou anonyme. Le bon choix dépend du couplage, des besoins d’accès et de la portée de la réutilisation.
Arbre de décision
Posez-vous les questions suivantes pour faire votre choix :
- La classe est-elle utilisée uniquement à l’intérieur de la classe englobante ? → Envisagez l’imbrication
- A-t-elle besoin de l’instance englobante ? → Classe interne ; sinon → Classe imbriquée statique
- Est-elle utilisée dans une seule méthode ? → Classe locale ou anonyme
- Implémente-t-elle une seule méthode ? → Lambda
Classe de niveau supérieur
Utilisez une classe de niveau supérieur lorsque le type est largement utilisé dans la base de code, représente un concept métier important ou doit être importé par de nombreuses autres classes.
// Top-level: used across many packages
public class Product {
// ...
}
public interface Repository<T, ID> {
Optional<T> findById(ID id);
void save(T entity);
}
// These belong in separate .java files and are widely importedClasse imbriquée statique
Utilisez une classe imbriquée statique lorsque la classe n’a de sens que dans le contexte de la classe englobante, qu’elle n’a pas besoin de l’instance englobante et qu’elle doit être accessible depuis l’extérieur.
class Graph {
// Edge only makes sense in the context of a Graph
public static class Edge {
public final int from, to, weight;
public Edge(int from, int to, int weight) {
this.from = from; this.to = to; this.weight = weight;
}
}
private List<Edge> edges = new ArrayList<>();
public void addEdge(int from, int to, int weight) {
edges.add(new Edge(from, to, weight));
}
}Classe interne (non statique)
Utilisez une classe interne lorsque la classe est fortement liée conceptuellement à l’instance englobante et doit accéder à ses membres privés, par exemple pour des itérateurs ou des objets auxiliaires étroitement couplés.
class DataStore<T> {
private final List<T> data;
DataStore(List<T> data) { this.data = data; }
// Must access data — inner class makes sense
class Snapshot {
private final List<T> copy;
Snapshot() { this.copy = List.copyOf(data); } // accesses outer
T get(int idx) { return copy.get(idx); }
int size() { return copy.size(); }
}
Snapshot snapshot() { return new Snapshot(); }
}Classe locale
Utilisez une classe locale lorsque la classe n’est nécessaire que dans une seule méthode, qu’elle est assez complexe pour comporter plusieurs méthodes ou un état, et que vous souhaitez limiter sa portée au minimum.
static int countWords(String text, boolean caseSensitive) {
class WordCounter {
Map<String, Integer> counts = new HashMap<>();
void count(String word) {
String key = caseSensitive ? word : word.toLowerCase();
counts.merge(key, 1, Integer::sum);
}
int uniqueCount() { return counts.size(); }
}
WordCounter wc = new WordCounter();
for (String w : text.split("\\s+")) wc.count(w);
return wc.uniqueCount();
}
System.out.println(countWords("the cat sat on the mat", false)); // 5Classe anonyme ou lambda
Utilisez une classe anonyme lorsqu’une implémentation comportant plusieurs méthodes ou l’extension d’une classe abstraite est nécessaire. Utilisez une lambda pour les interfaces SAM.
// Lambda: clean for SAM
list.sort((a, b) -> a.compareTo(b));
// Anonymous: multi-method, or extending abstract class
java.util.TimerTask task = new java.util.TimerTask() {
@Override public void run() { System.out.println("Tick!"); }
};
// TimerTask is abstract class — can't use lambda directlyTableau récapitulatif
Référence rapide :
- Niveau supérieur : large réutilisation, types de l’API publique
- Imbriquée statique : regroupement logique, aucune instance englobante nécessaire
- Interne : fortement liée à l’instance englobante, accès aux membres privés nécessaire
- Locale : portée limitée à la méthode, complexité suffisante pour justifier une classe
- Anonyme : implémentation ponctuelle, durée de vie courte
- Lambda : interface SAM, aucun état, syntaxe concise
Pratique : conception d’un client HTTP
Application d’une stratégie d’imbrication à la conception réaliste d’un client HTTP.
class HttpClient {
// Static nested: request config has no outer reference
public static class RequestConfig {
public final int timeoutMs;
public final String userAgent;
RequestConfig(int timeout, String ua) { this.timeoutMs = timeout; this.userAgent = ua; }
}
// Static nested: response is standalone data carrier
public static class Response {
public final int statusCode;
public final String body;
Response(int code, String body) { this.statusCode = code; this.body = body; }
}
private final RequestConfig config;
HttpClient(RequestConfig config) { this.config = config; }
public Response get(String url) {
// Implementation using this.config
return new Response(200, "body");
}
}Éviter l’imbrication excessive
Évitez d’imbriquer les classes sur plus d’un niveau. Les classes profondément imbriquées deviennent difficiles à parcourir et à tester. Extrayez-les en classes de niveau supérieur ou accessibles au niveau du paquetage si elles deviennent complexes.
Alternative accessible au niveau du paquetage
Au lieu d’imbriquer une classe, envisagez de la rendre accessible au niveau du paquetage (sans modificateur d’accès). Elle n’est visible qu’à l’intérieur du paquetage, mais elle est plus facile à tester et à maintenir qu’une classe imbriquée.
// In package com.example.order:
// Package-private: visible in package, no nesting
class OrderLine { // no 'public' modifier
final String sku;
final int qty;
OrderLine(String sku, int qty) { this.sku = sku; this.qty = qty; }
}
// Public class in same package can use OrderLine freely
public class Order {
private List<OrderLine> lines = new ArrayList<>();
// ...
}Les enregistrements et le scellement comme alternatives
Les fonctionnalités modernes de Java, comme les enregistrements et les interfaces scellées, éliminent souvent le besoin de stratégies d’imbrication complexes.
// Instead of nested inner class hierarchy:
sealed interface Shape permits Circle, Rectangle, Triangle {}
record Circle(double r) implements Shape {}
record Rectangle(double w, double h) implements Shape {}
record Triangle(double b, double h) implements Shape {}
static double area(Shape s) {
return switch (s) {
case Circle c -> Math.PI * c.r() * c.r();
case Rectangle r -> r.w() * r.h();
case Triangle t -> 0.5 * t.b() * t.h();
};
}Vérification rapide
Quand une classe interne (non statique) constitue-t-elle un meilleur choix qu’une classe imbriquée statique ?
Récapitulatif : choisir la bonne stratégie d’imbrication
Points essentiels :
- Niveau supérieur : types publics largement utilisés dans la base de code
- Imbriquée statique : regroupée logiquement avec la classe englobante, aucune instance englobante nécessaire
- Classe interne : fortement liée à l’instance englobante, accès aux membres privés
- Classe locale : portée limitée à la méthode, complexité suffisante pour plusieurs méthodes
- Classe anonyme : implémentation ponctuelle, déclaration et instanciation combinées
- Lambda : solution la plus claire pour les interfaces SAM ; à envisager pour remplacer les classes anonymes
Questions Fréquemment Posées
La leçon « Choisir la bonne stratégie d’imbrication » est-elle gratuite ?
Oui — le texte complet de « Choisir la bonne stratégie d’imbrication » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Choisir la bonne stratégie d’imbrication » ?
Choisissez entre les variantes de classes imbriquées en fonction du couplage, des besoins d’accès et de la lisibilité. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Java Academy ?
Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Choisir la bonne stratégie d’imbrication » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?
Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Classes imbriquées statiques
- Classes internes et accès à la classe externe
- Classes locales et anonymes
- Choisir la bonne stratégie d’imbrication