Så sker det: Java får de omstridte 'closures' i 2013

7. november 2012 kl. 13:139
De heftigt debatterede closures bliver en del af Java i 2013. Det glæder Javas oprindelige opfinder, James Gosling.
Artiklen er ældre end 30 dage
Manglende links i teksten kan sandsynligvis findes i bunden af artiklen.

De såkaldte 'closures' er på vej ind i programmeringssproget Javas fundament. Det skriver Infoworld.

Således skulle closures blive en del af JDK8, som er referenceimplementeringen af Java SE 8, der ventes klar i september næste år.

Det anses for at være en stor nyhed i Java-verdenen, hvor det i mange år har været debatteret, om closures overhovedet hører hjemme i sproget. Java er det eneste af de store, objektorienterede sprog, der endnu har formået at holde closures på behørig afstand.

Closure-tilhængere har anført, at de bør være en fast del af et moderne sprog. Modstanderne har argumenteret med, at Java allerede gaber over vel mange metodikker, og at der findes andre og bedre egnede sprog til closure-tilhængerne.

Artiklen fortsætter efter annoncen

En closure er kort fortalt en blok af kode - ofte en funktion - der ikke eksekveres her og nu, men kan bruges som parameter til en anden funktion. Closures rækker videre end eksempelvis funktionspointere kendt fra sprog som C og C++, da de blandt andet kan referere til variable fra deres oprindelige kontekst, eller scope.

Closures, som også kaldes lambda-udtryk, kan ifølge Javas egen opfinder, James Gosling, gøre flere programmeringsopgaver renere og mindre udsatte for fejl, siger han ifølge Infoworld.

Og selvom closures også kan bruges forkert og stække ydelsen af store programmer, er han alligevel glad for, at de endelig bliver en del af Java-sproget, siger han til it-mediet.

9 kommentarer.  Hop til debatten
Denne artikel er gratis...

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.

Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.

Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.

Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.

Debatten
Log ind eller opret en bruger for at deltage i debatten.
settingsDebatindstillinger
6
7. november 2012 kl. 22:25

En closure er kort fortalt en blok af kode - ofte en funktion - der ikke eksekveres her og nu, men kan bruges som parameter til en anden funktion.

Bare lige for at holde styr på terminologien. Det der beskrives der, er ikke en closure, men en first-class function. Men first-class functions er selvfølgelig nødvendige, for at man kan have en closure, idet en closure er en first class function, der "husker" og kan referere til den kontekst (scope), hvori den blev defineret.

9
10. januar 2013 kl. 21:31

Bare lige for at holde styr på terminologien. Det der beskrives der, er ikke en closure, men en first-class function. Men first-class functions er selvfølgelig nødvendige, for at man kan have en closure, idet en closure er en first class function, der "husker" og kan referere til den kontekst (scope), hvori den blev defineret.

Jeg har så imellemtiden lært at det kan Javas "closures" ikke. Variabler skal være "effective final" for at man kan referere til dem. Det betyder at eksterne variabler ikke må ændres hverken inden eller udenfor closuren efter at denne er defineret. Man kopierer nemlig blot værdien af variablen op i closuren.

For at tage et eksempel fra Scala-User mailinglisten:

  1. List<Integer> ints = new ArrayList<>();
  2. ints.add(1);
  3. ints.add(2);
  4. ints.add(3);
  5.  
  6. int sum = 0;
  7. ints.forEach(i -> {sum += i;});

Ovenstående virker ikke da "sum" ikke er "effective final". Det virker naturligvis i andre sprog, herunder Scala.

(lad os her se bort fra at det er den helt forkerte måde at beregne en sum på).

4
7. november 2012 kl. 16:35

Jeg havde lidt svært ved at finde eksempler på syntax på den nye feature. Som en service til læserne er her nogle eksempler:

  1. s -> s.length()
  2.  
  3. (int x, int y) -> x+y
  4.  
  5. () -> 42
  6.  
  7. (x, y, z) -> {
  8. if (true) return x;
  9. else {
  10. int result = y;
  11. for (int i = 1; i < z; i++)
  12. result *= i;
  13. return result;
  14. }
  15. }

5
7. november 2012 kl. 21:28

Den syntaks er da ikke engang så slem endda. Hvorfor har det taget så lang tid? Gik der cykelskur i den?

3
7. november 2012 kl. 16:22

Den eksistrende og kluntede konstruktion med at wrappe sin metode i en anonym indre klasse virker også fint. Den foldes i øvrigt sammen og vises som en closure i IntelliJ IDEA.

https://blogs.jetbrains.com/idea/tag/closures/

Closures i java er ingen revolution, men en lidt bedre syntaks for noget man allerede bruger intensivt i fx GWT og andre steder, hvor man registrer event-adfærd på komponenter.

2
7. november 2012 kl. 15:00

Der er til gengæld mange andre ting i Java, som jeg gerne ser hen, hvor peberet gror.

1
7. november 2012 kl. 14:59

Den danske java brugergruppe, javagruppen, har et møde om closures på torsdag kl 16-18 i Glostrup. Se mere og tilmeld dig på www.javagruppen.dk.

Bemærk, at man skal være medlem for at deltage - studerende har dog gratis adgang (angiv uddannelsessted som firmanavn).