2016-03-18 5 views
2

Ich unterrichte mich selbst Java, und ich genieße es wirklich, aber ich bin zum Thema "Anonymous Class" gekommen, und ich versuche zu verstehen, wann und wo Sie das sogar verwenden würden, von dem, was mein Buch sagt eine sehr beliebte Klasse, aber ich kann mich nicht darum kümmern, ich verstehe, wie man sie schafft. aber ich war nur auf der Suche nach ein bisschen mehr Informationen, damit ich anfangen kann, sie in meinen Klassen zu implementieren.Anonyme Klassen, wann und wo?

Ich würde wirklich einige Beispiele schätzen, und ein bisschen mehr Erklärung, wann es nützlich wäre, sie zu verwenden.

+2

Ich vermeide sie im Allgemeinen wie die Pest TBH, es sei denn, ich versuche, ein paar einfache Klassen zu schreiben, nur um etwas zu testen. Sie werden in keiner Hinsicht benötigt. In einer vollständigen Produktionsumgebung sind sie im Allgemeinen nicht erforderlich oder wünschenswert und komplizieren den Code einfach unnötig. Es ist viel sauberer, einfach diskrete Klassen in diskrete Dateien zu schreiben und eine Arbeitsteilung zu ermöglichen. Aber einige Leute finden möglicherweise größeren Gebrauch für sie. Ich denke, sie sind fast nutzlos, außer für sehr grundlegende Testzwecke oder sehr kleine diskrete anonyme Klassen von nur wenigen Zeilen, die zum Beispiel ActionListener implementieren. – ManoDestra

+4

Ich schlage vor, Sie lesen den Code in den Sammlungen Bibliotheken unter java.util. Dies hat viele Beispiele. Ich schlage auch vor, dass Sie alle Klassen in java.lang lesen. Sie würden erstaunt sein, wie viele Leute die Quelle selbst der gebräuchlichsten Bibliotheken nicht gelesen haben. ;) –

+0

Ich würde sagen, dass in Java 8 für die meisten Absichten und Zwecke die anonyme Klasse durch den Lambda-Ausdruck ersetzt wurde. Das Verständnis von anonymen Klassen bleibt wichtig, um älteren Code zu lesen und zu pflegen. – scottb

Antwort

8

Zuerst brauchen Sie nie brauchen eine anonyme Klasse. Sie können immer eine benannte Klasse erstellen. Wenn Sie anfangen, ist der Hauptgrund, über anonyme Klassen zu lernen, sie in Code zu erkennen, den Sie lesen.

Sie verwenden eine anonyme Klasse in Fällen, in denen Sie ein Objekt erstellen möchten, um es nur einmal zu verwenden. Meist sind sie nützlich bei der ereignisgesteuerten Programmierung, z. B. mit Swing. Ihr Event-Handler ist in der Regel einmalig für das Steuerelement, in das Sie ihn einklinken, daher ist es sinnlos, ihm einen Namen zu geben.

Für Ereignishandler ist es üblich, Zugriff auf das umgebende Objekt zu haben. Daher ist es praktisch, wenn der Ereignishandler eine innere Klasse ist und seine Verweise auf den umgebenden Kontext bedeuten, dass er überhaupt nicht wiederverwendet werden kann.

Gute Startbeispiele sind in the Oracle Java tutorial. Die Klassen FileFilter und FilenameFilter im Paket java.io werden oft mit anonymen Klassen verwendet, um anzugeben, welche Dateien der Filter zurückgeben soll.

In Java 8 lambdas geben Sie eine bessere Möglichkeit zum Erstellen von Single-Use-Instanzen von Klassen mit nur einer Methode.

+1

Sehr schöne Post +1. Häufig wird insbesondere in ereignisgesteuertem Code eine anonyme Klasse einmal pro Ereignis oder Aufruf erstellt und dann verworfen, obwohl eine anonyme Klasse einmal geschrieben wurde.In diesem Fall wird eine bessere Ressourcennutzung erreicht, indem die anonyme Klasse einer statischen Konstanten oder einer Enumeration zugewiesen wird oder indem eine benannte Klasse verwendet und diese verwendet wird, anstatt die anonyme Klasse immer wieder instanziieren. – scottb

+0

@scottb: Ich kann mir nicht ein Beispiel dafür vorstellen, aber ja, die Zuweisung der anonymen Instanz zu einer Konstanten ist sicherlich in Ordnung. –

+0

Vielen Dank für die Erklärung, obwohl ich fühle mich wie ein Ärgernis, indem ich einfache Fragen wie diese möchte ich so viel wie möglich lernen, so wenn ich mich für einen Job in Java bewerben kann ich anpassen und lernen während der Arbeit, so dass ich wirklich schätze deine Eingabe und gib mir Links, es hat wirklich geholfen, –

0

Wenn Sie eine benannte Klasse schreiben SomeClass, dann realisieren Sie, dass Sie nur new SomeClass einmal schreiben müssen, macht es oft Sinn, stattdessen eine anonyme Klasse zu verwenden.

Das sollten Sie nur tun, wenn der Rumpf der Klasse kurz ist (sonst leidet die Lesbarkeit) und Sie stattdessen keine Lambda oder Methodenreferenz verwenden können.

+1

* "dann realisierst du, dass du nur einmal eine neue SomeClass schreiben musst" * ... schreiben wir * jemals * dieselbe Klasse mehr als einmal? – scottb

+0

@scottb Ich spreche nicht über das Schreiben der gleichen Klasse nur einmal, ich spreche nur über den Konstruktor an einem Ort aufrufen. –