[Read Effective Java] Kapitel 2 Punkt 3 "Singleton-Eigenschaften mit privatem Konstruktor oder Aufzählungstyp erzwingen"

Erzwingen Sie Singleton-Eigenschaften mit einem privaten Konstruktor oder einem Aufzählungstyp

Vor Java1.5 gab es zwei Möglichkeiten, Singleton zu implementieren (Beispiel 1, Beispiel 2), aber die dritte Methode (Beispiel 4), die in 1.5 möglich wurde, ist die beste.

Glossar

Singleton

Eine Art Designmuster. Wird manchmal als "Singleton-Muster" bezeichnet. Kurz gesagt, eine Klasse, die genau einmal erstellt wird. Es wird verwendet, wenn Sie den Status "Es gibt immer nur eine Instanz einer bestimmten Klasse" erkennen möchten.

Wie man einen Singleton macht

Einzelne Tonne Probe


/**
 *Anwendungsweite Konfigurationsinformationen
 */
public class Config {
    /**
     *Deklarieren Sie den Konstruktor als privat, damit er nicht extern instanziiert werden kann
     */
    private Config() {
        //Tatsächlich werden die Einstellungsinformationen aus der Dateidatenbank usw. abgerufen.
        //Schreiben Sie den zu lesenden Prozess hier
    }

    /**
     *Gibt nur eine Instanz zurück
     * @return Die einzige Instanz dieser Klasse
     */
    public static Config getInstance() {
        return ConfigInstanceHolder.INSTANCE;
    }

    /**
     *Gibt den Einstellungswert zurück, der dem angegebenen Schlüssel entspricht
     * @Parametertasteinstellungstaste
     * @Einstellwert zurückgeben
     */
    public String getValue(String key) {
        //Tatsächlich werden die Einstellungsinformationen vom Konstruktor gelesen
        //Schreiben Sie den Prozess, um hierher zurückzukehren
        return ....;
    }

    /**
     *Innere Klasse, die die einzige Instanz der Config-Klasse enthält
     */
    public static class ConfigInstanceHolder {
        /**Einzige Instanz*/
        private static final Config INSTANCE = new Config();
    }
}

Aufzählungstyp

Enum (Aufzählungstyp) ist ein Typ, der mehrere Konstanten zu einer kombinieren kann. Die von Enum definierte Konstante wird als Enumerator bezeichnet.

public class Main {
 
    public static void main(String[] args) {
        Fruit fruit_type = Fruit.Orange;
        
        System.out.println(fruit_type);
    }
    
    protected enum Fruit {
        Orange,
        Apple,
        Melon
    };
    
}

Ausführungsergebnis


Orange

Elvis Presley

Großartiger Rock'n'Roller Ich mag "Ein bisschen weniger Unterhaltung" https://www.youtube.com/watch?v=Zx1_6F-nCaw

Elvis has left the Building.

Es ist ein Ausdruck, der mit der berühmten Episode des beliebten Sängers Elvis Presley der Vergangenheit zusammenhängt. Auch nach Presleys Konzert wurde das Publikum aufgefordert, den Veranstaltungsort zu verlassen, indem es dem Publikum, das nicht bereit ist, in Erwartung von Angkor zurückzukehren, mitteilte, dass "Elvis dieses Gebäude bereits verlassen hat". ..

Derzeit wird es für das Ende eines Ereignisses verwendet.

Beispielcode

Wie man eine einzelne Tonne vor 1.5 Teil 1 macht

Der Konstruktor ist preavte, der öffentliche statische Mitglieder bereitstellt, damit Benutzer der Klasse auf die einzige Instanz der Klasse zugreifen können.

Der private Konstruktor wird nur einmal aufgerufen, um das öffentliche statische Endfeld Elvis.INSTANCE zu initialisieren. Dies garantiert, dass Elvis der einzige auf der Welt ist.

Beispiel 1



//Singleton durch öffentliches Endfeld
public class Elvis{
    public static final Elvis INSTANCE = new Elvis();
    private Elvis() { ... }

    public void leaveTheBuliding() { ... }

}

Wie man eine einzelne Tonne vor 1.5 Teil 2 macht

Die zweite Methode besteht darin, das erste Mitglied statisch zu machen. Gibt eine Objektreferenz mit Elvis.getInstance () zurück. Das Gute daran ist, dass die Deklaration deutlich macht, dass die Klasse Singleton ist.

Beispiel 2



//Singleton mit statischer Factory-Methode
public class Elvis{
    private static final Elvis INSTANCE = new Elvis();
    private Elvis() { ... }
    public static Elvis getInstance() { return INSTANCE; }

    public void leaveTheBuilding() { ... }
}

Es besteht jedoch die Möglichkeit, dass in Elvis eine Fälschung vorhanden ist, die mit den Methoden der Beispiele 1 und 2 erstellt wurde, und es ist erforderlich, die folgende Methode hinzuzufügen, um dies zu verhindern.

Beispiel 3



//ReadResolve-Methode zum Beibehalten von Singleton-Eigenschaften
private Object readResolve() throws ObjectStreamException{
    /*
     *Geben Sie den echten Elvis zurück und verwandeln Sie den gefälschten Elvis in einen Müllsammler
     *Werde es los.
     * 
     */
    return INSTANCE;
}

Der neueste und beste Weg

Die dritte Methode, die seit Java 1.5 möglich ist. Erstellen Sie einfach einen Aufzählungstyp mit einem einzelnen Element. Es ist eine einfache Beschreibung, und es gibt Eisenwände, die keine Fälschungen zulassen. Wenn Sie also eine einzelne Tonne herstellen möchten, verwenden Sie diese Methode.

Beispiel 4



//Enum Singleton-Bevorzugte Methode
public enum Elvis {
    INSTANCE;

    public void leaveTheBuilding() { ... }
}

Fortsetzen

[Read Effective Java] Kapitel 2 Punkt 4 "Unmöglichkeit der Instanziierung mit privatem Konstruktor erzwingen" https://qiita.com/Natsukii/items/661b645482d814b73914

Recommended Posts

[Read Effective Java] Kapitel 2 Punkt 3 "Singleton-Eigenschaften mit privatem Konstruktor oder Aufzählungstyp erzwingen"
[Read Effective Java] Kapitel 2 Punkt 4 "Unmöglichkeit der Instanziierung mit privatem Konstruktor erzwingen"
Mit dem effektiven privaten Java-Konstruktor nicht unveränderlich erzwingen
[Read Effective Java] Kapitel 2 Punkt 7 "Vermeiden Sie Finalizer"
[Read Effective Java] Kapitel 2 Punkt 2 "Betrachten Sie einen Builder, wenn Sie mit einer großen Anzahl von Konstruktorparametern konfrontiert werden."
[Read Effective Java] Kapitel 3 Punkt 10 "Immer toString überschreiben"
[Read Effective Java] Kapitel 3 Punkt 12 "Berücksichtigung der Implementierung von Comparable"
[Read Effective Java] Kapitel 2 Punkt 6 "Veraltete Objektreferenzen entfernen"
[Read Effective Java] Kapitel 2 Punkt 5 "Vermeiden Sie die Erstellung unnötiger Objekte"
[Read Effective Java] Kapitel 2 Punkt 1 "Betrachten Sie statische Factory-Methoden anstelle von Konstruktoren"
[Read Effective Java] Kapitel 3 Punkt 8 "Wenn Sie gleich überschreiben, befolgen Sie den allgemeinen Vertrag"
Effektives Java Kapitel 2
Effektives Java Kapitel 6 34-35
Effektives Java Kapitel 4 15-22
Effektives Java Kapitel 3
Java getClass () ist nicht kompatibel mit Generika (oder Typvariablen).
Implementieren Sie Singleton mit Enum schnell in Java