web-dev-qa-db-fra.com

Fermeture dans Java 7

Qu'est-ce que la fermeture? Il est supposé être inclus dans Java 7. Les fermetures ont été discutées pour inclusion dans Java 7, mais à la fin, elles n'ont pas été incluses. -ed) Quelqu'un peut-il me fournir des références fiables sur lesquelles je peux apprendre des choses sur les fermetures?

99
Swaranga Sarma

Voici le blog de Neal Gafter l'un des pionniers introduisant les systèmes de fermeture en Java. Son article sur les clôtures du 28 janvier 2007 est nommé Définition des fermetures Sur son blog, vous trouverez de nombreuses informations pour vous aider à démarrer et des vidéos. Voici une excellente conversation Google - Sujets avancés dans les langages de programmation - Fermetures pour Java avec Neal Gafter, également.

57
Bartzilla

Une fermeture est un bloc de code qui peut être référencé (et transmis) avec un accès aux variables de la portée englobante.

Depuis Java 1.1, la classe interne anonyme a fourni cette installation de manière extrêmement détaillée. Elle dispose également d'une restriction imposant l'utilisation de variables locales final (et définitivement affectées). . (Notez que même les variables locales non -final sont dans la portée, mais ne peuvent pas être utilisées.)

Java SE 8 est destiné à en avoir une version plus concise pour les interfaces à une méthode *, appelées "lambdas". Les Lambdas ont à peu près les mêmes restrictions que les classes internes anonymes, bien que certains détails varient de manière aléatoire.

Les Lambda sont en cours de développement sous Projet Lambda et JSR 335 .

* À l'origine, la conception était plus flexible, permettant l'utilisation de types de méthodes abstraites uniques (SAM). Malheureusement, la nouvelle conception est moins flexible, mais tente de justifier l’autorisation de mise en œuvre au sein des interfaces.

82

Selon Tom Hawtin

Une fermeture est un bloc de code qui peut être référencé (et transmis) avec un accès aux variables de la portée englobante.

Maintenant, j'essaie d'imiter l'exemple de fermeture JavaScript sur Wikipedia , avec une traduction " straigth " en Java, dans le espérons être 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"

Maintenant, la partie Java: Function1 est l'interface "Functor" avec l'arité 1 (un argument). Closure est la classe implémentant le Function1, un Functor concret qui agit comme une fonction (int -> int). Dans la méthode main (), je viens d'instancier foo en tant qu'objet Closure, en répliquant les appels de l'exemple JavaScript. La classe IntBox n'est qu'un simple conteneur, elle se comporte comme un tableau de 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());

    }
}

Il imprime:

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

S'il vous plaît voir this page wiki pour la définition de la fermeture.

Et cette page pour la fermeture dans Java 8: http://mail.openjdk.Java.net/pipermail/lambda-dev/2011-September/003936.html

Regardez également ce Q & A: Fermetures dans Java 7

5
anubhava

Les fermetures de Java feront partie de J2SE 8 et devraient sortir d'ici la fin de 2012.

La prise en charge des fermetures de Java 8 comprend le concept des expressions lambda, référence de méthode, référence du constructeur et méthodes par défaut.

Pour plus d'informations et des exemples concrets, veuillez visiter: http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-Java.html

4
Amit Phaltankar

Oui, Closure (expressions lambda) est la nouvelle fonctionnalité de la prochaine version de la version Java SE 8). Pour plus d’informations à ce sujet, cliquez sur le lien ci-dessous: http: // docs. Oracle.com/javase/tutorial/Java/javaOO/lambdaexpressions.html

3
Anurag Ratna

Une implémentation de fermeture pour Java 5, 6 et 7

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

Il contient tout ce que l'on pourrait demander ...

0
momomo