Les closures sont une façon de faire des fonctions un type de données, pouvant être stoqué dans des variables, passé en paramètre d’appel de fonction, etc. Ceci n’existe pas actuellement en Java, mais un prototype est en cours de réalisation pour par Neal Gafter (le présentateur de la session, de chez Google), en vue d’établir un JSR. [Suite:]\n\nLes intérêts des closures sont nombreux. Pour combler leur absense en Java actuellement, on doit avoir recours à des classes internes annonymes. Par exemple, si on a une fonction « execute » qui s’attend à une instance de Runnable en paramètre, on le créerait habitellement comme ceci: \nexecute(new Runnable() {\npublic void Execute() {\n...\n}\n});
A la place de ça, une closure permettrait d’écrire:\n\n\nexecute({...});
Ou encore mieux (une syntaxe spéciale, équivalente à la précédente, mais qui le rend plus intuitif):\n\n\nexecute{\n...\n}
C’est considérablement plus simple!\n\nD’autre part, il ne s’agit pas simplement de simplifications syntaxiques. En effet, les classes internes annonymes sont bel et bien des classes à part, et à ce titre, elles n’ont pas accès aux variables non finales de la classe parente. Le code qu’elles contiennent doit donc tenir compte de ce fait, et être écrit de manière à contourner cette bizarrerie sémantique. Les closures apportent un remplacement simple et efficace pour ce genre de problème. Il peut de plus y avoir d’autres problèmes avec les classes anonymes, notamment dans la mesure où elles ne peuvent pas très bien (ou du moins, pas très facilement) remonter les exceptions ou renvoyer un résultat. Les closures ne présentent pas ce problème.\n\nPar exemple, on pourrait définir une fonction « with_lock » qui accepterait en paramètre d’une part le nom du verrou qu’on veut prendre, et d’autre part une closure contenant le code à sécuriser. L’utilisation d’une closure permettrait que les exceptions éventuelles qui pourraient être lancées par le contenu de la closure soient remontées à la fonction contenant l’appel with_lock, et non pas à la fonction with_lock elle-même. On pourrait donc écrire du code comme ceci:private void with_lock (String lock, {=> void} closure) {acquire lock\nclosure();\n//release lock\n}\n\npublic void myFunction () throws Exception {\nwith_lock {\n//faire diverses choses susceptibles de lancer une exception...throw new Exception("Closure test!");\n}\n}
Donc, le « throws Exception » est répercuté, assez naturellement, sur la fonction MyFunction, et non pas sur with_lock. Je ne suis pas sûr que la syntaxe ci-dessus soit exactement correcte (et de toute manière, ce n’est encore qu’un prototype donc ça peut encore changer), mais c’est à peu près ça.Pour plus de renseignements, on peut regarder: http://gafter.blogspot.com http://blogs.sun.com/ahe http://blogs.sun.com/gbracha/entry/achieving_closure