Es ist möglich, mehrere Klassen der obersten Ebene in einer Datei zu definieren, es gibt jedoch keine Vorteile und Risiken.
Das Risiko besteht darin, dass eine Klassendefinition mehrfach ist. Welche der mehreren Definitionen verwendet wird, hängt von der Reihenfolge ab, in der die Quelldateien an den Compiler übergeben werden. Betrachten Sie die Hauptklasse, die auf zwei Klassen der obersten Ebene verweist, z.
public class Main {
public static void main(String[] args) {
System.out.println(Utensil.NAME + Dessert.NAME);
}
}
Erstellen Sie die Utensil-Klasse und die Desert-Klasse in einer Datei namens Utensil.java.
class Utensil {
static final String NAME = "pan";
}
class Dessert {
static final String NAME = "cake";
}
Wenn Sie zu diesem Zeitpunkt Main ausführen, wird die Meldung "Pfannkuchen" angezeigt.
Angenommen, die folgende Klasse ist in Desert.java definiert.
class Utensil {
static final String NAME = "pot";
}
class Dessert {
static final String NAME = "pie";
}
Wenn Sie jetzt mit dem Befehl javac Main.java Dessert.java kompilieren, schlägt die Kompilierung fehl und zeigt an, dass die Klassen Utensil und Dessert dupliziert werden. Zu diesem Zeitpunkt wechselt der Compiler zuerst zu Main.java. Wenn er einen Verweis auf Utensil sieht, wechselt er zu Utensil.java und findet die Klassen Utensil und Desert. Wenn der Compiler zu Dessert.java wechselt, findet er die Utensil- und Dessert-Definitionen erneut. Wenn javac Main.java oder javac Main.java Utensil.java verwendet wird, ist das Ergebnis (Pfannkuchenanzeige) dasselbe wie vor dem Schreiben von Desert.java. Wenn jedoch javac Dessert.java Main.java verwendet wird, wird es als Potpie angezeigt.
Auf diese Weise wird das Verhalten des Programms durch die Reihenfolge beeinflusst, in der es kompiliert wird.
Die Lösung besteht einfach darin, nur eine Klasse der obersten Ebene in einer Quelldatei zu definieren.
Alternativ können Sie es als statische Elementklasse definieren (Item24). Wenn diese Klasse als Hilfsklasse für eine andere Klasse dient, kann die Lesbarkeit zu einer statischen Elementklasse die Lesbarkeit verbessern und unnötigen Zugriff reduzieren (private statische Elementklasse). Zu). Das Folgende ist ein spezifisches Beispiel.
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