Schließung in Java 7 [geschlossen]


105

Was ist Schließung? Es soll in Java 7 enthalten sein. (Verschlüsse wurden für die Aufnahme in Java 7 besprochen, aber am Ende wurden sie nicht aufgenommen. -Ed) Kann mir jemand bitte einige zuverlässige Referenzen geben, von denen ich Informationen über Verschlüsse erhalten kann?

Antworten:


59

Hier ist Neal Gafters Blog, einer der Pioniere, die Schließungen in Java einführen. Sein Beitrag über Schließungen vom 28. Januar 2007 heißt A Definition of Closures. In seinem Blog gibt es viele Informationen, die Ihnen den Einstieg erleichtern, sowie Videos. Hier ist ein ausgezeichneter Google-Vortrag - Fortgeschrittene Themen in Programmiersprachen - Verschlüsse für Java mit Neal Gafter.


2
Haben Sie einen spezifischeren Link als das gesamte Blog?
I82Much


1
Wenn jemand so dumm ist wie ich und wenn du deinen Kopf gegen die Wand schlägst, nur um zu wissen, was zum
Teufel

Ich kann mir nicht vorstellen, Verschlüsse in einer Sprache zu implementieren, die sie anfangs nicht hatte. irgendwie verrückt
Alexander Mills

Alexander Mills nur neugierig .. warum?
Bartzilla

84

Ein Abschluss ist ein Codeblock, auf den beim Zugriff auf die Variablen des umschließenden Bereichs verwiesen (und der weitergegeben werden kann).

Seit Java 1.1 hat die anonyme innere Klasse diese Funktion sehr ausführlich bereitgestellt. Sie haben auch die Einschränkung, nur finallokale Variablen verwenden (und definitiv zuweisen) zu können. (Beachten Sie, dass auch nicht finallokale Variablen im Gültigkeitsbereich sind, aber nicht verwendet werden können.)

Java SE 8 soll eine präzisere Version für Schnittstellen mit einer Methode * haben, die als "Lambdas" bezeichnet wird. Lambdas haben fast die gleichen Einschränkungen wie anonyme innere Klassen, obwohl einige Details zufällig variieren.

Lambdas werden im Rahmen des Projekts Lambda und JSR 335 entwickelt .

* Ursprünglich war das Design flexibler und erlaubte SAM-Typen (Single Abstract Methods). Leider ist das neue Design weniger flexibel, versucht jedoch zu rechtfertigen, die Implementierung innerhalb von Schnittstellen zuzulassen.


7

Laut Tom Hawtin

Ein Abschluss ist ein Codeblock, auf den beim Zugriff auf die Variablen des umschließenden Bereichs verwiesen (und der weitergegeben werden kann).

Jetzt versuche ich, das JavaScript-Schließungsbeispiel auf Wikipedia mit einer " geraden " Übersetzung nach Java zu emulieren , in der Hoffnung, nützlich zu sein:

//ECMAScript
var f, g;
function foo() {
  var x = 0;
  f = function() { return ++x; };
  g = function() { return --x; };
  x = 1;
  print('inside foo, call to f(): ' + f()); // "2"  
}
foo();
print('call to g(): ' + g()); // "1"
print('call to f(): ' + f()); // "2"

Nun der Java-Teil: Function1 ist eine "Functor" -Schnittstelle mit Arity 1 (ein Argument). Closure ist die Klasse, die die Funktion1 implementiert, einen konkreten Funktor, der als Funktion fungiert (int -> int). In der main () -Methode instanziiere ich foo einfach als Closure-Objekt und repliziere die Aufrufe aus dem JavaScript-Beispiel. Die IntBox-Klasse ist nur ein einfacher Container. Sie verhält sich wie ein Array von 1 int:

int a [1] = {0}

interface Function1   {
    public final IntBag value = new IntBag();
    public int apply();
}

class Closure implements Function1 {
   private IntBag x = value;
   Function1 f;
   Function1 g;

   @Override
   public int apply()  {
    // print('inside foo, call to f(): ' + f()); // "2"
    // inside apply, call to f.apply()
       System.out.println("inside foo, call to f.apply(): " + f.apply());
       return 0;
   }

   public Closure() {
       f = new Function1() {
           @Override
           public int apply()  {
               x.add(1);
                return x.get();
           }
       };
       g = new Function1() {
           @Override
           public int apply()  {
               x.add(-1);
               return x.get();
           }
       };
    // x = 1;
       x.set(1);
   }
}
public class ClosureTest {
    public static void main(String[] args) {
        // foo()
        Closure foo = new Closure();
        foo.apply();
        // print('call to g(): ' + g()); // "1"
        System.out.println("call to foo.g.apply(): " + foo.g.apply());
        // print('call to f(): ' + f()); // "2"
        System.out.println("call to foo.f.apply(): " + foo.f.apply());

    }
}

Es druckt:

inside foo, call to f.apply(): 2
call to foo.g.apply(): 1
call to foo.f.apply(): 2 

2
IMO außer dem Namen hat dies nichts mit Schließungen zu tun
n00b


4

Java Closures werden Teil von J2SE 8 sein und sollen Ende 2012 veröffentlicht werden.

Die Unterstützung für Java 8-Abschlüsse umfasst das Konzept von Lambda-Ausdrücken, Methodenreferenz, Konstruktorreferenz und Standardmethoden.

Weitere Informationen und Arbeitsbeispiele hierfür finden Sie unter: http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html


1
Hmm, Java 8 erlaubt jedoch keine Änderung der Schließungsvariablen. Guter Artikel.
Nawfal


0

Eine Abschlussimplementierung für Java 5, 6 und 7

http://mseifed.blogspot.se/2012/09/bringing-closures-to-java-5-6-and-7.html

Es enthält alles, was man sich wünschen kann ...


Der Link führt zu einem Text, der ihn beschreibt, aber der von dieser Seite verlinkte Code existiert nicht. Wo ist die Implementierung?
Jerry Jeremiah

@JerryJeremiah Hier ist es, es hat jetzt einen anderen Namen, auch alle ursprünglich vorhandenen Versionen sind nicht vorhanden (um nicht endgültigen Zugriff und mehr durch abstrakte Klassen zu unterstützen, könnte es für <Java 8-Versionen erneut hinzugefügt werden, welche Plattform sind Sie? auf der Suche nach?): bitbucket.org/momomo/opensource/src
mmm

2
Links brechen!
Sunleo

Ich habe eine 404 der Link ist tot
Alexander Mills

Link defekt (deshalb sollten wir keine Links als Antworten setzen ...)
OhadR
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.