Was ist der Unterschied zwischen anonymen Klassen in Java und Verschlüsse?
Sieht es aus wie anonyme Klasse bietet grundlegende Funktionen, die Schließung, ist das wahr?
- Nein, es ist nicht wahr.
- Warum nach unten Stimmen? Er versucht feedback zu bekommen und auf seine Ansicht von Schließungen, wenn seine falsch erklären, warum... nicht downvote?
- Ich würde empfehlen, das Lesen '- Blöcke in Java' auf dem blog fishbowl.pastiche.org/2003/05/16/closures_and_java_a_tutorial es führt Sie durch Verschlüsse vs innere Klassen.
- +1 Gute Frage eigentlich.. Anonyme Klassen werden oft im Vergleich zu Sperrungen (in der Regel nur durch Java-Programmierer, die ignorieren die Unterschiede)
- Das ist eine gute Frage. Übrigens: Der Wikipedia-Artikel listet Javas innere Klassen als (simulierte?) Verschlüsse: en.wikipedia.org/wiki/Closure_(computer_science)#Java.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Soweit Sie beide betreffen, sonst "private" Bereiche, in einem sehr begrenzten Sinne ja. jedoch gibt es so viele Unterschiede, dass die Antwort vielleicht auch nicht.
Da Java fehlt die Fähigkeit, code-Blöcke als wahre R-Werte, innere Klassen nicht-pass-code-Blöcke als erfolgt in der Regel in Fortsetzungen. Deshalb ist die Schließung als eine Fortsetzung Technik völlig fehlt.
Während der Lebensdauer einer Klasse werden von der garbage Collection eingesammelt wird erweitert durch die Menschen, hält Sie innere Klassen (ähnlich Verschlüsse halten Variablen lebendig, während Sie Erholung an der Schließung), die Fähigkeit von Java zu tun Umbenennung durch Bindung beschränkt sich auf die Einhaltung der bestehenden Java-syntax.
Zuzulassen und threads richtig zu stomp nicht über die jeweils anderen Daten mithilfe von Java-thread-Streit-Modell, innere Klassen werden weiter eingeschränkt Zugang zu Daten, ist garantiert nicht zu stören, aka final einheimischen.
Diese ignoriert völlig die andere innere Klassen (auch bekannt als statische innere Klassen), die sich etwas anders fühlen. In anderen Worten, es berührt auf ein paar Elemente, die Sperrungen umgehen konnte, aber bei der Unterschreitung der Mindestanforderungen, dass die meisten Menschen würden es als erforderlich erachten, als eine Schließung.
final
für Variablen gebunden zu sein, ist vor allem für die Abwärtskompatibilität an dieser Stelle.Es ist fast kein Unterschied. In der Tat gibt es ein altes Sprichwort über Schließungen und Objekte. Verschlüsse sind des Armen Mannes Objekt, und Objekte sind des Armen Mannes Schließung. Beide sind gleich mächtig in Bezug auf was Sie tun können. Wir sind nur gestritten, über Ausdruckskraft.
In Java wir sind Modellierung closures mit Anonymen Objekten. In der Tat eine kleine Geschichte hier ist, dass ursprünglich hatte Java die Möglichkeit zum ändern der äußere Umfang ohne die Verwendung von Finale. Das funktioniert und funktioniert für Objekte zugeordnet, die in der lokalen Gültigkeitsbereich der Methode, aber wenn es um die primitive dies verursachte viel Kontroverse. Primitive sind auf dem Stapel reserviert, so dass, um für Sie zu Leben, vorbei an der Ausführung der äußeren Methode Java haben würde, um Speicher auf dem heap, und verschieben Sie diese Mitglieder in den heap. Damals waren die Leute sehr neu auf garbage collection, und Sie hatte kein Vertrauen, so kann der Anspruch war Java sollte nicht mit Speicher ohne ausdrückliche Anweisung durch den Programmierer. In den Bemühungen um Streik einen Kompromiss Java entschieden, das Schlüsselwort final.
http://madbean.com/2003/mb2003-49/
Nun das interessante an der Sache ist, dass Java entfernen konnte, die Einschränkung und nutzen Sie die Schlüsselwort optional jetzt, jeder ist besser als der garbage collector und man könnte es komplett kompatibel ist, von einer Sprache, die Perspektive. Obwohl die Arbeit um für dieses Problem ist einfach zu definieren-Instanz-Variablen auf das Anonyme Objekt, und ändern Sie diese so viel wie Sie wünschen. In der Tat, dass könnte eine einfache Möglichkeit zur Implementierung von Schließung Stil Verweise auf den lokalen Bereich durch hinzufügen von öffentlichen Instanz-Variablen der anonymen Klasse durch den compiler, und das umschreiben der source-code verwenden Sie diese anstelle von stack-Variablen.
Würde umgeschrieben werden zu:
Ich denke, der Grund, warum Menschen beschweren sich über Anonyme innere Klassen hat mehr zu tun mit der statischen Typisierung vs. dynamische Typisierung. In Java müssen wir definieren eine vereinbarte Schnittstelle für die Implementierung der anonymen Klasse und dem code der Annahme der anonymen Klasse. Wir müssen das tun, damit wir eingeben können, überprüfen Sie alles, was zur compile-Zeit. Hätten wir die 1. Klasse der Funktionen, die Java benötigen würde, um definieren eine syntax für die Deklaration einer Methode die Parameter und return Typen als Datentyp zu bleiben, eine statisch typisierte Sprache für die Typ-Sicherheit. Das wäre fast so Komplex wie die Definition einer Schnittstelle. (Ein interface definieren mehrere Methoden, eine syntax für die Deklaration der 1. Klasse-Methoden wäre nur für eine Methode). Man könnte denken, dies als ein kurzes Formular-Schnittstelle syntax. Unter der Haube der compiler übersetzen könnte kurze form-notation, um eine Schnittstelle zur compile-Zeit.
Gibt es eine Menge Dinge, die getan werden könnte, um Java zu verbessern, wird die Anonyme Klasse Erfahrung, ohne Notwasserung der Sprache oder einer größeren Operation.
IMHO, Sie dienen einem ähnlichen Zweck, allerdings ein Verschluss vorgesehen ist, um präziser und potenziell bieten mehr Funktionalität.
Sagen, Sie wollen, um eine lokale variable mit Hilfe einer anonymen Klasse.
Verschlüsse zu vermeiden die Notwendigkeit für die meisten der boiler plate-Codierung, indem Sie schreiben genau das, was beabsichtigt ist.
oder sogar
oder wenn die Verschlüsse Unterstützung von code-Blöcken.