Software, Systemudvikling og systemer

Sådan bliver den næste Java

Efter flere års forsinkelse er version 7 af Java-miljøet parat til juli. Vi ser nærmere på nyhederne.

Egentlig var det meningen, at der skulle udsendes en ny udgave af Java nogenlunde hver 18. måned. Men de sidste års turbulens omkring Sun Microsystems, som endte med en overtagelse fra Oracle, har betydet tavshed fra producenten siden Java 6 i 2006 indtil nu.

Nu ser det dog ud til, at Java 7 kommer til juli. Prosabladet bringer her et overblik over, hvilke nyskabelser der kommer med. Lige før målstregen er en række funktioner blevet skubbet videre til version otte, der er planlagt til udgangen af 2012. Heriblandt er closures, der er kodeblokke, som kan benyttes som parameter i et metodekald, nok den mest savnede, men det skulle altså være med i næste ombæring.

Farvel til File

Den måske største nyhed i Java 7 er et farvel til File-objektet som indgang til fil-i/o i Java. Der er for meget bøvl med den gamle implementering, så i stedet for at udvide File erstattes den med en nyt interface, Path, i pakken java.nio.file.

Tillige kommer en ny klasse, Files, som understøtter alle tidligere filoperationer, samt en række nye. Man kan skabe filer, åbne, lukke, slette og flytte dem – men i modsætning til tidligere nu med ensartet opførsel på alle platforme og uden at fejle tavst, som det tidligere kunne være tilfældet med metoderne i File.

Filer i mapper tilgås med en iterator, i stedet for et array som tidligere, hvilket skalerer langt bedre til store mapper. En WatchService gør det muligt at holde øje med eksterne filoperationer i en mappe.

Man kan tilgå det underliggende styresystems metadata og søge på filnavne med regulære udtryk. Det er nemt at komme frem og tilbage til File-objektet via metoderne File.toPath() og Path.toFile(). Her er en række af mulighederne vist:

 

Automatisk ressourcestyring

Det klassiske idiom, når en ressource som for eksempel en inputstrøm skal lukkes, har været noget med en masse try-catch-blokke inden i hinanden. Årsagen er, at flere af operationerne kan fejle og kaste nye exceptions, jo længere hen i operationen man kommer. Det bliver til en gyselig kodesuppe, der oven i købet ofte skrives på den forkerte måde.

For at løse det problem har en af de gamle kendinge fra Java-verdenen, Joshua Bloch, der stod bag Java 1.3 til 1.5, fundet på noget, der kaldes ARM eller automatisk ressourcestyring, og som minder stærkt om using-operatoren i C#. Fidusen er, at eksempelvis IO- og JDBC-klasserne får sig et nyt interface, Autoclosable, som gør det muligt at simplificere en lukke-operation væsentligt og på en helt sikker facon. Man kan også selv benytte Autoclosable og på den måde udnytte faciliteten, hvis der skal håndteres dyrebare eksterne ressourcer. Det ser således ud:

Multicatch

Vi bliver lidt i genren, for næste punkt på dagsordenen er multicatch, der ganske simpelt gør det muligt at samle forskellige exceptions i en catch-blok. Tidligere har det kun været muligt i den grad, at de ønskede exceptions befandt sig på det rigtige sted i nedarvningshierarkiet, men nu kan vilkårlige exceptions samles med den logiske eller-operator:

Diamantoperator

I Java 7 kan compileren selv foretage typeinferens, altså gætte typen, på højre side af tildelingstegnet, når man instantierer generiske typer. Så slipper man for at skrive hele molevitten igen på højre side, og det er især rart, når der optræder mere end én typeparameter. Det kaldes "diamantoperator" på grund af udseendet - <>.

Strenge som argument til switch

Man kan nu bruge strenge i switch-sætninger. Mere er der ikke at sige om den sag. Det ser sådan ud:

 
Nemmere binære og heltalskonstanter
For at gøre det nemmere at skrive konstanter i koden kan binære tal nu skrives med nuller og ettaller, mens store heltal kan deles i blokke med understreg-tegnet.

Varargs uden advarsler

Varargs er den facilitet, hvor man kan benytte et vilkårligt antal argumenter i halen af en parameterliste til et metodekald, med tre prikker bag typen. Argumenterne bliver så til et array i metodekroppen. Arrays og typeparametre spiller ikke godt sammen, så hver gang klassen benyttes, genereres der en compiler-advarsel i den kode, som bruger klassen. Det kan undertrykkes én gang for alle med annotationen @SafeVarargs over metoden, som benytter varargs-argumentet.

Parallelle programmer med Fork-Join

Hvis programmerne, der skrives i dag, skal kunne gøre brug af de mange flere kerner, som computerne udstyres med i fremtiden, skal de skrives parallelt. Det er svært at skrive programmer, som bygger på tråde, men frameworks kan lette arbejdet.

I Java 5 kom tråd-pools og opgavekøer med i pakken java.util.concurrent, og fra samme hånd – parallelismeeksperten Doug Lea – kommer Fork-Join til Java 7. Det er et framework, hvor en opgave deles op i en række ens underopgaver, der så udføres samtidigt i en række tråde, ved at splitte problemet op i to dele, der igen kan deles succesivt. Når problemet er finkornet nok, løser klassen delproblemet, og derefter sættes de enkelte delløsninger sammen.

Det er samme princip som i map-reduce-princippet, kendt fra Google. Det bliver for omfattende at komme ind på detaljerne her, men Oracles Java Tutorials har et gennemarbejdet eksempel, som nemt findes ved at søge på "java tutorial fork join".

Og alt det andet ...

Der er ganske mange flere nyheder i Java 7, end der er gennemgået her. Det handler eksempelvis om flere parallelisme-nyheder oven i Fork-Join, såsom låse, der gør det nemmere at skrive trådede programmer, og en ny classloader-arkitektur mest for dem, der skriver applikationsservere.

Netværkssockets kan nu tilgås med Channels, og ligeledes på IO-fronten kommer asynkron I/O, mest med henblik på serverapplikationer. Under Windows Vista og 7 er det nu styresystemets fødte IPv6-stak, Java benytter sig af.

Unicode kommer i ny version seks, og der er bedre internationalisering med mulighed for at have separate værdier for locale og ui-locale. Det er nu muligt at benytte gakkede variabelnavne, såkaldt "eksotiske identifiers" for at kunne kalde felter og metoder skabt efter reglerne i andre JVM-sprog end Java.

På sikkerhedssiden findes den seneste udgave af SSL-protokollen med det officielle navn TLS 1.2 samt en ny slags kryptografi, Ecliptic Curve Cryptography, som skulle være den seneste opfindelse fra den front. Databasebiblioteket JDBC er nu i version 4.1 og understøtter som tidligere nævnt automatisk ressourcestyring.

Swing har fået et nyt Nimbus-look, der ikke ser særlig kønt ud, samt et nyt JLayer-komponent, som kan benyttes som et overlag på et andet komponent, så man kan male på et andet komponent uden at skulle subklasse det. JLayer kan også fange events, før de rammer det underliggende komponent. Derudover er Javas XML-biblioteker blevet opdateret, og JMX og MBeans, der benyttes til styrepaneler til serversystemer, har fået en overhaling.