Chiusura in Java 7 [chiuso]


105

Cos'è la chiusura? Dovrebbe essere incluso in Java 7. (Le chiusure sono state discusse per l'inclusione in Java 7, ma alla fine non sono state incluse. -Ed) Qualcuno può fornirmi alcuni riferimenti affidabili da cui posso imparare cose sulle chiusure?

Risposte:


59

Ecco il blog di Neal Gafter, uno dei pionieri che ha introdotto le chiusure in Java. Il suo post sulle chiusure del 28 gennaio 2007 si chiama A Definition of Closures Sul suo blog ci sono molte informazioni per iniziare così come i video. Ecco un eccellente discorso di Google - Argomenti avanzati nei linguaggi di programmazione - Anche le chiusure per Java con Neal Gafter.


2
Hai un link più specifico del blog in generale?
I82 Molto


1
Se qualcuno è stupido come me e se stai sbattendo la testa contro il muro solo per sapere qual è il trucco è questa chiusura ... allora
eccoti

Non riesco a immaginare di implementare chiusure in una lingua che inizialmente non le aveva ... un po 'pazzo
Alexander Mills

Alexander Mills è solo curioso .. perché?
Bartzilla

84

Una chiusura è un blocco di codice che può essere referenziato (e passato in giro) con accesso alle variabili dell'ambito che lo racchiude.

A partire da Java 1.1, la classe interna anonima ha fornito questa funzionalità in modo estremamente dettagliato. Hanno anche la limitazione di poter usare solo final(e definitivamente assegnate) variabili locali. (Nota, anche finalle variabili non locali rientrano nell'ambito, ma non possono essere utilizzate.)

Java SE 8 è progettato per avere una versione più concisa di questo per interfacce a metodo singolo *, chiamate "lambda". I Lambda hanno più o meno le stesse restrizioni delle classi interne anonime, sebbene alcuni dettagli variano in modo casuale.

Le Lambda sono in fase di sviluppo nell'ambito del Progetto Lambda e JSR 335 .

* In origine il design era più flessibile consentendo i tipi Single Abstract Methods (SAM). Sfortunatamente il nuovo design è meno flessibile, ma cerca di giustificare l'implementazione all'interno delle interfacce.


7

Secondo Tom Hawtin

Una chiusura è un blocco di codice che può essere referenziato (e passato in giro) con accesso alle variabili dell'ambito che lo racchiude.

Ora sto cercando di emulare l'esempio di chiusura JavaScript su Wikipedia , con una traduzione " diretta " in Java, nella speranza di essere utile:

//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"

Ora la parte java: Function1 è l'interfaccia "Functor" con arity 1 (un argomento). Closure è la classe che implementa la Function1, un Functor concreto che funge da funzione (int -> int). Nel metodo main () ho solo istanziato foo come oggetto Closure, replicando le chiamate dall'esempio JavaScript. La classe IntBox è solo un semplice contenitore, si comporta come un array di 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());

    }
}

Stampa:

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

2
IMO oltre al nome questo non ha nulla a che fare con le chiusure
n00b


4

Le chiusure Java faranno parte di J2SE 8 e saranno rilasciate entro la fine del 2012.

Il supporto per le chiusure di Java 8 include il concetto di espressioni Lambda, riferimento al metodo, riferimento al costruttore e metodi predefiniti.

Per ulteriori informazioni ed esempi di lavoro, visitare: http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html


1
Hmm, tuttavia Java 8 non consente la modifica della variabile di chiusura. Buon articolo.
nawfal


0

Un'implementazione di chiusura per Java 5, 6 e 7

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

Contiene tutto ciò che si potrebbe chiedere ...


Il link rimanda a un testo che lo descrive ma il codice collegato a quella pagina non esiste. Dov'è l'implementazione?
Jerry Jeremiah

@JerryJeremiah Eccolo, ha un nome diverso ora, inoltre tutte le versioni originariamente presenti non ci sono (per supportare l'accesso non finale e altro tramite classi astratte, potrebbe essere aggiunto di nuovo per <versioni Java 8, quale piattaforma sei cercando?): bitbucket.org/momomo/opensource/src
mmm

2
I collegamenti si stanno interrompendo!
sunleo

Ho ricevuto un 404 il collegamento è morto
Alexander Mills

collegamento interrotto (questo è il motivo per cui non dovremmo inserire collegamenti come risposte ...)
OhadR
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.