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.
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é.
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