Was macht dieses Java-Konstrukt?

8

Ich bin neu bei Java, also ertragen Sie mit mir, wenn das eine lächerlich einfache Frage ist, aber ich bin neugierig auf diesen Methodenaufruf, bei dem {code} eingefügt wurde - siehe Code unten für ein Beispiel in der Methode addSelectionListener. Was ist der Zweck davon? Ich habe in der Dokumentation nach einer Erklärung gesucht, aber ich kann nicht finden, wie diese Praxis genannt wird, geschweige denn irgendeine nützliche Information.

%Vor%

Danke für Hilfe oder Einsichten, die angeboten werden können

    
BandyOrc 21.04.2010, 09:08
quelle

5 Antworten

7

Dies ist eine anonyme Klasse oder eine anonyme innere Klasse. Wenn Sie danach googlen, finden Sie einige Tutorials / Beispiele. Sun hat auch einige Dokumente .

    
Sam Holder 21.04.2010, 09:13
quelle
4

Wie die anderen Mitwirkenden bereits sagten: Es ist eine anonyme Klasse

Sie hätten eine neue Klasse namens MyClass in einer neuen Datei namens McClass.java erstellen können, die wie folgt aussieht:

%Vor%

Dann hätten Sie die erste Zeile so ändern können:

setStatusLine.addSelectionListener (neu MyClass ());

Siehe? Jetzt haben Sie eine "explizite" Klasse mit nur einer Funktion. Das ist oft zu viel Aufwand und würde Ihr Design überladen.

Hilft das?

    
das_weezul 21.04.2010 09:25
quelle
3

Die Methode addSelectionListener empfängt eine SelectionListener-Instanz. Es erhält keinen "Code". Die verwirrende Sache ist die Verwendung des neuen & lt; class / interface name & gt; () {...}. Dieses Konstrukt wird für anonyme innere Klassen verwendet. In der Tat erweitert der obige Code die SelectionAdapter-Klasse, überschreibt ihre widgetSelected-Methode, erstellt eine Instanz der neuen Klasse und übergibt sie an addSelectionListener ().

Die Verwendung von anonymen inneren Klassen ist bei Listenern üblich, wo wir eine neue Klasse erstellen, die an einem bestimmten Ort verwendet werden kann. Daher geben wir ihm keinen Namen, und wir ziehen es vor, ihn direkt in dem Kontext zu implementieren, in dem er verwendet wird.

    
Eyal Schneider 21.04.2010 09:21
quelle
2

Tatsächlich gibt es keinen Methodenaufruf ... Dieser Code setzte einen Auswahllistener für die Komponente setStatusLine.

Ein Äquivalent dieses Codes könnte

sein %Vor%     
Fred 21.04.2010 09:18
quelle
0

Ich brauchte einige Zeit, um die anonymen inneren Klassen zu verstehen. Die grundlegenden Dinge zu erinnern sind:

Sie sind genau wie Parameter, außer dass Sie ein primitives oder Object übergeben, das Sie in einer Klasse übergeben, die ein Interface implementiert / eine Klasse erweitert (ja, sie arbeiten auch mit Interfaces), abhängig vom Methodenparameter. Sie sind anonym, also "verschwinden" gleich nachdem die Methode vom Stapel genommen wurde.  }); ist ein totes Give-Away für eine anonyme innere Klasse. Sie tauchen häufig Benutzeroberflächen für Listener-Ereignisse auf Sie sparen Unordnung in Ihrem Code, aber machen es auch schwieriger zu lesen.

Zur vollständigen Bestrafung lesen Sie die JLS: Ссылка

Wenn Sie daran interessiert sind, das Wesentliche über solche Dinge zu wissen, ist es gut, das SCJP-Buch zu lesen und die Prüfung zu machen, oder Sie können die JLS studieren. Es wird Sie nicht lernen, wie man programmiert, aber es wird Ihnen helfen, zu verstehen, wie Java und in gewisser Weise viele andere OO-Sprachen funktionieren.

    
Selenia 21.04.2010 12:36
quelle

Tags und Links