[JAVA] Punkt 25: Beschränken Sie Quelldateien auf eine einzelne Klasse der obersten Ebene

25.1 Beschränken Sie sich auf eine Klasse der obersten Ebene pro Datei

Es ist möglich, mehrere Klassen der obersten Ebene in einer Datei zu definieren, es gibt jedoch keine Vorteile und Risiken.

Probleme beim Definieren mehrerer Klassen der obersten Ebene in einer Datei

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.

Lösung

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

Punkt 25: Beschränken Sie Quelldateien auf eine einzelne Klasse der obersten Ebene
So dekompilieren Sie eine Java-Klassendatei
Punkt 23: Bevorzugen Sie Klassenhierarchien gegenüber markierten Klassen
Verwandeln Sie sich von einer normalen Klasse in einen Lambda-Stil
[Android] Erstellen Sie eine neue Klasse, indem Sie ImageView erben
So erstellen Sie eine Klasse, die Klasseninformationen erbt
So konvertieren Sie einen Soliditätsvertrag in eine Java-Vertragsklasse