HOWTO · Java

Classe statique en Java

Cet article présente les classes statiques Java.

Sur cette page

En Java, une classe de premier niveau ne peut pas être déclarée static. En revanche, une classe déclarée à l’intérieur d’une autre peut l’être : on parle alors de classe imbriquée statique. Elle peut être instanciée sans instance de sa classe englobante et utiliser les membres statiques de celle-ci. Pour empêcher les appelants de construire une classe utilitaire par son API publique, utilisez plutôt un constructeur privé : il s’agit d’un modèle de conception distinct.

Qu’est-ce qu’une classe imbriquée statique en Java ?

Une classe imbriquée statique est un type membre déclaré avec le mot-clé static à l’intérieur d’une autre classe. Le modificateur static signifie qu’une instance de la classe imbriquée ne possède pas de référence implicite à un objet de la classe englobante. Cela ne signifie pas que la classe imbriquée ne peut pas être instanciée. On accède à son type par l’intermédiaire du type englobant, par exemple Container.Entry, puis on appelle une méthode d’instance sur une instance de ce type imbriqué.

Une classe imbriquée statique peut accéder aux membres statiques de sa classe englobante, y compris aux membres privés. Elle ne peut pas faire référence aux champs ou aux méthodes d’une instance englobante comme si cet objet était automatiquement disponible. Elle peut le faire si un objet de la classe englobante lui est fourni explicitement.

Comment déclarer et utiliser une classe imbriquée statique

Déclarez la classe membre avec static, puis utilisez le nom du type englobant pour en créer une instance. Cet exemple complet montre également comment accéder à un champ statique de la classe englobante :

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

public class Container {
    private static int count = 3;

    public static class Entry {
        public int value() {
            return count;
        }
    }

    public static void main(String[] args) {
        Container.Entry entry = new Container.Entry();
        System.out.println(entry.value());
    }
}
3

L’exécution de l’exemple affiche 3. Pour l’adapter, gardez la classe imbriquée à l’intérieur de la classe englobante et, en dehors de Container, qualifiez son type avec Container.Entry. L’objet Entry est une instance ordinaire, tandis que count appartient à la classe englobante elle-même.

Classe imbriquée statique ou classe interne

Une classe membre non statique est généralement appelée classe interne. Pour en créer une instance, il faut une instance englobante : créez un objet Container, puis utilisez container.new Inner(). Une instance de classe interne peut accéder directement aux membres d’instance de l’objet englobant, car elle conserve cette association.

Une classe imbriquée statique ne possède pas cette association implicite. Pour lire un champ d’instance de la classe englobante, transmettez-lui un objet Container ou obtenez-en un autrement, puis accédez au champ à l’aide de cette référence. Les deux sortes de classes imbriquées peuvent accéder aux membres autorisés par les règles d’accès de Java pour les types imbriqués ; la différence essentielle est la disponibilité automatique d’une instance englobante.

Comment créer une classe utilitaire non instanciable

Une classe utilitaire regroupe des opérations ou des constantes qui ne nécessitent pas d’état propre à chaque objet. Placez ces membres dans une classe ordinaire de premier niveau, déclarez static les membres appropriés et ajoutez un constructeur private afin que les appelants ordinaires ne puissent pas invoquer new depuis l’extérieur de la classe. Par exemple, le modèle est public final class TextTools { private TextTools() {} public static String join(String first, String second) { return first + second; } } ; appelez-le ainsi : TextTools.join("static ", "utility").

Le constructeur privé empêche la création ordinaire d’instances depuis l’extérieur, mais ne transforme pas TextTools en classe statique : Java ne permet pas de déclarer une classe de premier niveau statique. Déclarer la classe final est facultatif et empêche uniquement la création de sous-classes. Utilisez ce modificateur si cette restriction fait partie de la conception, et non parce que les méthodes utilitaires l’exigent.

Idées reçues courantes sur les classes statiques

Une classe imbriquée statique peut être instanciée : static supprime l’exigence d’une instance englobante implicite. Ses méthodes d’instance peuvent utiliser ses propres champs d’instance. Le nom de la classe englobante qualifie le type imbriqué, mais il faut toujours un objet de ce type imbriqué pour appeler ses méthodes d’instance.

Un contexte statique ne peut pas accéder à un membre d’instance de la classe englobante par un nom non qualifié, car aucun objet englobant n’est disponible automatiquement. Il peut accéder à ce membre par l’intermédiaire d’une référence explicite à un objet. De même, un constructeur privé d’une classe utilitaire empêche les appels ordinaires depuis l’extérieur de la classe ; il ne rend pas la création d’instances impossible dans toutes les circonstances. Ces distinctions permettent de séparer la syntaxe des classes imbriquées de Java du modèle des classes utilitaires.