Ich habe in letzter Zeit viele OOP Design Patterns durchgesehen und bin auf einige seltsame Dinge gestoßen, die ich noch nie zuvor gesehen habe:
%Vor%Was macht das konkret (zB was macht das "neue" Schlüsselwort hier?):
%Vor%Zweite Frage:
%Vor%Dies ist ein Ausschnitt aus einem Beobachterentwurfsmuster. Nach meinem neuen Verständnis erstellt der Name.propertyChange (...) ein Objekt von PropertyChangeEvent und über die Observer-Musterimplementierung von Java benachrichtigt er die Beobachter automatisch, indem er die Informationen dieses neuen Objekts an die Beobachter sendet (oder etwas, das diesem sehr ähnlich ist). Ist das korrekt?
Hier erstellt das Schlüsselwort new
eine anonyme Klasse.
Dies ist nützlich, wenn Sie einen Listener zum Ausführen einer Aktion benötigen und Sie möchten, dass Ihr Code gruppiert bleibt und / oder die Klasse "einmalig" ist, was bedeutet, dass sie nirgendwo anders verwendet wird.
>Hier ist ein Link zum Sun-Tutorial zu anonymen Klassen. Alle normalen Klassenregeln gelten. Sie müssen beim Erstellen einer Schnittstelle abstrakte Methoden oder alle Methoden implementieren.
Scope ist etwas anders, da Sie auf Variablen zugreifen können, die in der Klasse deklariert sind, in der Ihre anonyme Klasse verschachtelt ist. Sie können jedoch nicht auf lokale Variablen aus einer anonymen Klasse zugreifen, es sei denn, diese lokalen Variablen werden als final deklariert. Zum Beispiel:
%Vor% Wenn someString
in einem größeren globalen Umfang deklariert würde, wäre dies nicht der Fall.
Zu Ihrer zweiten Frage:
Ja. Sie haben Recht, das passiert im Snippet. Beachten Sie, dass jedes Mal ein neues PropertyChangeEvent
erstellt wird? Das ist so, dass Listener, die früher in der Liste erscheinen, die PropertyChangeEvent
für Elemente, die später in der Liste erscheinen, nicht ändern.
Zunächst ist dies eine Java-spezifische Syntax: Es gibt keine vergleichbare Syntax in C #, wo Sie entweder eine anonyme Klasse erstellen müssen, die object
erweitert, oder eine Instanz einer benannten Klasse erstellen.
In Java können Sie mit dieser Syntax eine anonyme Unterklasse von SelectionAdapter
erstellen und dabei alle Methoden überschreiben, die Sie für richtig halten. Dies entspricht dem Erstellen einer benannten Klasse, die SelectionAdapter
erweitert, alle Methoden wie in den geschweiften Klammern nach dem SelectionAdapter()
-Konstruktoraufruf überschreibt und dann den Namen dieser abgeleiteten Klasse im Aufruf von addSelectionListener
verwendet. Der einzige Unterschied besteht darin, dass eine solche abgeleitete Klasse einen Namen hat, während die anonyme Klasse aus Ihrem Beispiel keinen Namen * für Programmierer verfügbar hat.
* Intern anonyme Klassen haben Namen: Sie können sie sehen, wenn Sie sich die Liste der vom Java-Compiler erzeugten Klassendateien ansehen. Dateien mit Dollarzeichen und Zahlen in ihren Namen entsprechen anonymen Klassen.