Fermeture en Java 7 [fermé]

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

94
demandé sur Cheeso 2011-03-26 19:07:19

7 réponses

Voici Le blog de Neal gater l'un des pionniers de l'introduction des fermetures en Java. Son article sur les fermetures du 28 janvier 2007 s'intitule Une définition des fermetures sur son blog il y a beaucoup d'informations pour vous aider à démarrer ainsi que des vidéos. Un voici un excellent Google talk- sujets avancés dans les langages de programmation-Fermetures pour Java avec Neal gater, ainsi.

55
répondu Bartzilla 2015-11-02 16:21:57

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

Depuis Java 1.1, la classe interne anonyme a fourni cette fonctionnalité de manière très verbeuse. Ils ont également une restriction de ne pouvoir utiliser que des variables locales final (et définitivement assigné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é à avoir une version plus concise de ceci pour interfaces à méthode unique*, appelées "lambdas". Lambdas ont à peu près les mêmes restrictions que les classes internes anonymes, bien que certains détails varient au hasard.

Les lambda sont en cours de développement dans le cadre du projet Lambda et jsr 335.

* à l'origine, la conception était plus flexible permettant des types de méthodes abstraites simples (SAM). Malheureusement, la nouvelle conception est moins flexible, mais tente de justifier l'implémentation dans les interfaces.

75
répondu Tom Hawtin - tackline 2013-04-11 12:43:30

Veuillez consulter cette page wiki pour la définition de la fermeture.

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

Regardez aussi ce Q & A: fermetures en Java 7

5
répondu anubhava 2017-05-23 12:02:43

Selon Tom Hawtin

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

Maintenant, j'essaie d'émuler L'exemple de fermeture JavaScript sur Wikipedia , avec une traduction" straigth " vers Java, dans L'espoir d'ê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 une interface "Functor" avec arity 1 (un argument). La fermeture est la mise en œuvre de la classe la Function1, un foncteur concret qui agit comme fonction (int - > int). Dans la méthode main (), je viens d'instancier foo en tant qu'objet de fermeture, en répliquant les appels de L'exemple JavaScript. La classe IntBox est juste 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 
5
répondu Rob Rosetti 2017-05-23 11:47:05

Les fermetures Java vont faire partie de J2SE 8 et devraient être publiées d'ici la fin de 2012.

La prise en charge des fermetures de Java 8 inclut le concept D'Expressions Lambda, la référence de méthode, la référence de constructeur et les méthodes par défaut.

Pour plus d'informations et des exemples de travail pour cela, veuillez visiter: http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html

4
répondu Amit Phaltankar 2012-09-28 14:41:36

Oui, Closure (Lambda Expressions) est la nouvelle fonctionnalité de la prochaine version de Java SE 8. Vous pouvez obtenir plus d'informations à ce sujet à partir du lien ci-dessous: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

3
répondu Anurag Ratna 2014-02-05 07:31:46

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...

1
répondu momo 2013-08-01 11:13:13