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

De heftigt debatterede closures bliver en del af Java i 2013. Det glæder Javas oprindelige opfinder, James Gosling.

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.

Læs også: Closures deler Java-folket

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.

Tips og korrekturforslag til denne historie sendes til tip@version2.dk
Følg forløbet
Kommentarer (9)
sortSortér kommentarer
  • Ældste først
  • Nyeste først
  • Bedste først
#3 Rune Larsen

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.

http://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.

  • 1
  • 0
#4 Baldur Norddahl

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:

s -> s.length()  
   
(int x, int y) -> x+y  
   
() -> 42  
   
(x, y, z) -> {  
  if (true) return x;  
  else {  
    int result = y;  
    for (int i = 1; i < z; i++)  
      result *= i;  
    return result;  
  }  
}
  • 4
  • 0
#6 Simon Friis Vindum

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.

  • 0
  • 0
#9 Baldur Norddahl

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:

List<Integer> ints = new ArrayList<>();   
ints.add(1);   
ints.add(2);   
ints.add(3);   
   
int sum = 0;   
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å).

  • 0
  • 0
Log ind eller Opret konto for at kommentere