[JAVA] Punkt 24: Bevorzugen Sie statische Elementklassen gegenüber nicht statischen

24. Wählen Sie eine statische Elementklasse aus einer nicht statischen Elementklasse aus

Verschachtelte Klassen sollten vorhanden sein, um die einschließende Klasse zu unterstützen. Wenn Sie verschachtelte Klassen in anderen Kontexten verwenden möchten, sollten Sie sie als Klassen der obersten Ebene definieren.

Verschachtelter Klassentyp

Es gibt vier Arten verschachtelter Klassen

Es gibt. Anders als die statischen Elementklassen werden sie als innere Klassen bezeichnet.

In diesem Kapitel wird beschrieben, welche verschachtelte Klasse in welchen Situationen und aus welchem Grund verwendet werden soll.

statische Mitgliedsklasse

Die statische Elementklasse ist eines der statischen Elemente der einschließenden Klasse und folgt denselben Zugriffsregeln wie die anderen statischen Elemente.

Eine der häufigsten Verwendungen von statischen Elementklassen ist die Verwendung einer öffentlichen Hilfsklasse, die nur gültig ist, wenn sie verdeckt mit der äußeren Klasse verwendet wird. Betrachten Sie als Beispiel enum, das den Betrieb eines Computers darstellt (Punkt 34). Die Operation enum sollte eine öffentliche statische Memberklasse der Calculator-Klasse sein. Benutzer von Calcurator können Operationen als Calculator.Operation.PLUS und Calculator.Operation.PLUS bezeichnen.

Nicht statische Mitgliedsklasse

Instanzen nicht statischer Elementklassen verweisen implizit auf einschließende Instanzen. In einer Instanzmethode in einer nicht statischen Elementklasse können Sie die Methode der einschließenden Instanz aufrufen und diese mit qualifizierter Methode verwenden, um einen Verweis auf die einschließende Instanz abzurufen. (Qualifiziert bezieht sich dies auf die einschließende Klasse .dies) Es ist unmöglich, eine Instanz einer nicht statischen Elementklasse ohne eine umschließende Instanz zu erstellen. Wenn Sie also möchten, dass sie unabhängig ist, müssen Sie eine statische Elementklasse auswählen.

Verweise auf nicht statische Elementklassen und einschließende Instanzen werden gebildet, wenn die Elementklassen instanziiert und danach nicht geändert werden. Referenzen werden normalerweise durch Aufrufen der Konstruktoren nicht statischer Elementklassen aus den Instanzmethoden der einschließenden Klasse gebildet.

Eine häufige Verwendung für nicht statische Elementklassen ist Adapter. Adapter können verwendet werden, um eine Instanz einer umschließenden Klasse als Instanz einer anderen Klasse erscheinen zu lassen. Insbesondere verwendet das sammlungsähnliche Erscheinungsbild, das von den keySet- und values-Methoden von Map zurückgegeben wird, nicht statische Elementklassen. Wie der Iterator auf der Liste.

    public Iterator<E> iterator() {
        return new Itr();
    }

    /**
     * An optimized version of AbstractList.Itr
     */
    private class Itr implements Iterator<E> {
    ...
    }

Wenn eine Mitgliedsklasse nicht auf die einschließende Instanz zugreifen muss, sollte sie immer als statisch deklariert werden. Dies liegt daran, dass das Generieren einer Referenz während dieser Zeit Zeit und Speicher benötigt und ohne diese Referenz möglicherweise eine Speicherbereinigung erforderlich ist (Punkt 7).

Private statische Elementklassen werden als Teil der Komponenten der einschließenden Klasse dargestellt. In Anbetracht einer Map-Instanz haben viele Map-Implementierungen beispielsweise ein Entry-Objekt als Schlüssel-Wert-Paar in der Map. Da die Eingabemethoden (getKey, getValue, setValue) nicht auf die Zuordnungsmethoden zugreifen müssen, ist es sinnlos, den Eintrag zu einer nicht statischen Klasse zu machen. Es funktioniert auch, wenn es nicht statisch ist, aber es ist eine Verschwendung von Speicher, nur weil es zusätzliche Verweise auf die Karte hinzufügt.

Selbst wenn Sie sich fragen, ob eine verschachtelte Klasse nach außen verfügbar gemacht werden soll, ist es wichtig zu entscheiden, ob sie statisch oder nicht statisch sein soll. Wenn eine verschachtelte Klasse nach außen verfügbar ist, kann sie nicht von nicht statisch in statisch geändert werden. (Es wird die Abwärtskompatibilität verletzen)

Anonyme Klasse

Es kann gesagt werden, dass eine anonyme Klasse gleichzeitig deklariert und instanziiert wird, wenn sie verwendet wird, anstatt zu einer anderen Klasse zu gehören. Anonyme Klassen können Instanzen enthalten, in denen Klassen in nicht statischen Kontexten eingeschlossen werden. Selbst wenn eine anonyme Klasse in einem statischen Kontext geschrieben ist, kann sie kein statisches Element haben, es sei denn, es handelt sich um eine konstante Variable (primitive oder String-Variable mit final).

Anonyme Klassenbeschränkungen

Vor der Einführung von Lambda wurden anonyme Klassen verwendet, um kleine Funktionsobjekte und Prozessobjekte (?) Zu erstellen. Jetzt wird jedoch Lambda bevorzugt. Darüber hinaus wird es als Hauptverwendungsbeispiel für die anonyme Klasse bei der Implementierung einer statischen Factory-Methode verwendet. (Punkt 20)

Lokale innere Klasse

Lokale innere Klassen werden auf dieselbe Weise wie lokale Variablen deklariert und haben denselben Gültigkeitsbereich. Sollte zur besseren Lesbarkeit kurz gehalten werden.

Zusammenfassung

Es gibt vier verschachtelte Klassen mit jeweils unterschiedlichen Verwendungszwecken. Bereiten Sie eine Member-Klasse vor, wenn sie außerhalb der Methode sichtbar oder zu lang sein muss, um innerhalb der Methode platziert zu werden. Wenn jede Instanz der Mitgliedsklasse Zugriff auf eine Instanz der einschließenden Klasse benötigt, sollte sie nicht statisch sein. Ansonsten sollte es statisch sein.

Verwenden Sie die Klasse in der Methode nur an einer Stelle. Wenn eine Klasse vorhanden ist, die das Verhalten reguliert, verwenden Sie die anonyme Klasse. Verwenden Sie andernfalls lokale innere Klassen.

Recommended Posts

Punkt 24: Bevorzugen Sie statische Elementklassen gegenüber nicht statischen
Punkt 29: Generische Typen bevorzugen