[JAVA] Point 25: limiter les fichiers source à une seule classe de premier niveau

25.1 Limite à une classe de premier niveau par fichier

Il est possible de définir plusieurs classes de niveau supérieur dans un seul fichier, mais il n'y a ni avantages ni risques.

Problèmes de définition de plusieurs classes de premier niveau dans un fichier

Le risque est qu'une définition de classe soit multiple. Laquelle des définitions multiples est utilisée est affectée dans l'ordre dans lequel les fichiers source sont passés au compilateur. Considérez la classe Main, qui fait référence à deux classes de niveau supérieur, telles que:

public class Main {
    public static void main(String[] args) {
        System.out.println(Utensil.NAME + Dessert.NAME);
    }
}

Créez la classe Utensil et la classe Desert dans un fichier appelé Utensil.java.

class Utensil {
    static final String NAME = "pan";
}

class Dessert {
    static final String NAME = "cake";
}

A ce moment, si vous exécutez Main, le message "pancake" apparaîtra.

Ici, supposons que la classe suivante soit définie dans Desert.java.

class Utensil {
    static final String NAME = "pot";
}

class Dessert {
    static final String NAME = "pie";
}

Maintenant, si vous compilez avec la commande javac Main.java Dessert.java, la compilation échoue et vous indique que les classes Utensil et Dessert sont dupliquées. À ce stade, le compilateur accède d'abord à Main.java, et lorsqu'il voit une référence à Utensil, il va à Utensil.java et trouve les classes Utensil et Desert. Lorsque le compilateur accède à Dessert.java, il trouve à nouveau les définitions d'Utensil et de Dessert. Si javac Main.java ou javac Main.java Utensil.java est utilisé, le résultat (affichage de crêpes) sera le même qu'avant d'écrire Desert.java. Cependant, lorsque javac Dessert.java Main.java est utilisé, il s'affiche sous forme de potpie.

De cette manière, le comportement du programme sera affecté par l'ordre dans lequel il est compilé.

Solution

La solution consiste simplement à définir une seule classe de premier niveau dans un fichier source.

Vous pouvez également le définir en tant que classe membre statique (Item24). Si cette classe sert d'auxiliaire à une autre classe, en faire une classe membre statique peut améliorer la lisibilité et réduire les accès inutiles (classe membre statique privée). À). Voici un exemple spécifique.

public class TestStaticMember {

    public static void main(String[] args) {
        System.out.println(Utensil.NAME + Dessert.NAME);
    }

    private static class Utensil {
        static final String NAME = "pan";
    }

    private static class Dessert {
        static final String NAME = "cake";
    }
}

Recommended Posts

Point 25: limiter les fichiers source à une seule classe de premier niveau
Comment décompiler un fichier de classe Java
Élément 23: Préférez les hiérarchies de classes aux classes balisées
Transformer d'une classe normale en un style lambda
[Android] Créez une nouvelle classe en héritant d'ImageView
Comment créer une classe qui hérite des informations de classe
Comment convertir un contrat de solidité en une classe de contrat Java