Mit dem effektiven privaten Java-Konstruktor nicht unveränderlich erzwingen

Effektive Java-eigene Interpretation. Ich habe versucht, Punkt 4 der 3. Ausgabe zu interpretieren, indem ich meinen eigenen Code geschrieben habe.

Fazit

Geben Sie für Klassen mit nur statischen Mitgliedern einen privaten Konstruktor an, der eine Laufzeitausnahme auslöst.

Erläuterung

Beispielsweise verfügt eine Utility-Klasse, die nur allgemeine Prozesse sammelt (im Folgenden: Util-Klasse), nur über statische Methoden und statische Variablen und basiert nicht auf der Instanziierung.

Im Allgemeinen verfügt die öffentliche Util-Klasse über einen öffentlichen Standardkonstruktor, sofern kein Konstruktor definiert ist. Daher besteht die Sorge, dass er in einer externen Klasse unnötig instanziiert wird.

Durch die explizite Definition eines privaten Konstruktors können Konstruktoraufrufe außerhalb der Util-Klasse verhindert werden. Durch Einfügen der Verarbeitung von Ausnahmeausgaben in den Konstruktor ist es auch möglich, einen Konstruktoraufruf in der Util-Klasse zu einem Fehler zu machen.

Code ohne Konstruktordefinition (schlechtes Beispiel)

** Util Klasse **

public class SampleUtil {

    public static final String HOGE = "hoge";

    public static String fugaMethod() {
        return "fuga";
    }
}

** Anruferklasse **

public class SampleService {

    public String sampleMethod() {
        //Nutzlos instanziiert
        SampleUtil sampleUtil = new SampleUtil();
        return sampleUtil.fugaMethod();
    }
}

Ich erstelle eine Instanz in der aufrufenden Klasse. Da fugaMethod () eine statische Methode ist, ist es sinnlos, sie zu instanziieren.

Code mit privater Konstruktordefinition (gutes Beispiel)

** Util Klasse **

public class SampleUtil {

    //Definieren Sie einen Konstruktor, der privat ist und eine Laufzeitausnahme ausgibt
    private SampleUtil() {
        throw new IllegalStateException("Util instance construction is not allowed.");
    }

    public static final String HOGE = "hoge";

    public static String fugaMethod() {
        return "fuga";
    }

}

** Anruferklasse **

public class SampleService {

    public String sampleMethod() {
        return SampleUtil.fugaMethod();
    }
}

Da der Konstruktor privat ist, kann er überhaupt nicht in einer anderen Klasse instanziiert werden.

Auch wenn der Konstruktor in der Util-Klasse aufgerufen wird, wird eine Ausnahme ausgegeben und keine Instanz erstellt. Wenn Sie Code haben, der einen Konstruktor aufruft, handelt es sich um einen Programmierfehler. Stellen Sie daher sicher, dass Sie eine Laufzeitausnahme auslösen.

Recommended Posts

Mit dem effektiven privaten Java-Konstruktor nicht unveränderlich erzwingen
[Read Effective Java] Kapitel 2 Punkt 4 "Unmöglichkeit der Instanziierung mit privatem Konstruktor erzwingen"
[Read Effective Java] Kapitel 2 Punkt 3 "Singleton-Eigenschaften mit privatem Konstruktor oder Aufzählungstyp erzwingen"
[Java] Testen Sie private Methoden mit JUnit
Java (Konstruktor)
Java-Konstruktor
Effektives Java Kapitel 2
Effektives Java Kapitel 6 34-35
Effektives Java Kapitel 4 15-22
Verstehen Sie den Java-Konstruktor
Effektives Java Kapitel 3
[Java] So lassen Sie die Federkonstruktorinjektion mit Lombok weg
[Java] Verweisen Sie auf und setzen Sie private Variablen mit Reflektion
Installieren Sie Java mit Homebrew
Wechseln Sie die Plätze mit Java
Installieren Sie Java mit Ansible
effektive Java 3. Zusammenfassung
Bequemer Download mit JAVA
Java bezahlte private Memo
Schalten Sie Java mit direnv
Java 8 studieren (siehe Konstruktor)
Java-Download mit Ansible
JAVA-Konstruktoraufrufverarbeitung
Lass uns mit Java kratzen! !!
Erstellen Sie Java mit Wercker
Über Java-Kapselung privat öffentlich
Builder-Muster (effektives Java)
Endian-Konvertierung mit JAVA
[Read Effective Java] Kapitel 2 Punkt 2 "Betrachten Sie einen Builder, wenn Sie mit einer großen Anzahl von Konstruktorparametern konfrontiert werden."