Det er sommer på den nordlige halvkugle af kloden, og det betyder, at en ny Java-version er tæt på at finde sin færdige form. Med version 10 overgik Java til en køreplan med halvårlige udgaver, og det betyder, at versionerne færdiggøres sommer og vinter, og udkommer forår og efterår.
Den største nyhed i 11’eren er en ny HTTP-klient, som skal afløse den bedagede URLConnection-klasse fra Java 1.0-tiden. HTTP-klienten giver som URLConnection mulighed for at foretage HTTP-kald fra klientsiden, til REST-kommunikation og andre formål, men understøtter HTTP i version 2.0, udover klassikerne 1.0 og 1.1, samt de nye websockets-protokoller, der etablererer en HTTP-lignende forbindelse, men med færre headere og anden overhead.
HTTP-klienten har egentlig været med i OpenJDK i en testudgave siden version 9, men er nu forfremmet til fuldgyldigt medlem af biblioteksfamilien.
Klienten kan minde om Apache-projektets pendant og har mange tilsvarende faciliteter. Kald kan udføres blokerende eller asynkront, via Java 8’s CompletableFuture-klasse.
I eksemplet her skaber vi en HttpClient via dets ‘fluent’-api, hvor et builder-objekt konfigureres efter behov. Her beder vi om en klient, der bruger HTTP2-protokollen, og der er mange andre muligheder, såsom at fastsætte proxy, redirect-adfærd, timeout-tid og så videre.
Request-objektet skabes også med en fluent builder. Herunder foretager vi et blokerende kald med HttpClient.send-metoden til en HTTP2-testserver. Retur får vi et HttpResponse-objekt, og dets body-metode returnerer i dette tilfælde body’en i HTTP-svaret som en streng.
var client = HttpClient .newBuilder() .version(HttpClient.Version.HTTP_2) .build(); var request = HttpRequest .newBuilder() .uri(URI.create("https://http2.akamai.com/demo")) .build(); var response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println("Fik denne HTTP-statuskode tilbage: " + response.statusCode()); assert response.body().contains("Your browser supports HTTP/2!");
HttpClient-klassen kan også starte en websocket-session. Det gøres ved at kalde metoden HttpClient.newWebSocketBuilder.buildAsync, som returnerer et WebSocket-objekt, pakket ind i en CompletableFuture, der er en asynkron wrapper. Kaldet skal udstyres med en WebSocket.Listener-parameter, der håndterer svar fra serveren med handleren onText:
var listener = new WebSocket.Listener() { public CompletionStage<?> onText(WebSocket webSocket, CharSequence message, boolean last) { System.out.println("Websocket-serveren svarede: " + message); assert message.equals("Hvad drikker Møller?"); return null; } }; var websocketFuture = client.newWebSocketBuilder() .buildAsync(URI.create("wss://echo.websocket.org"), listener);
WebSocket-objektet inde i wrapperen tilgås med join-metoden på CompletableFuture-objektet, der returnerer, når serverforbindelsen er initieret. Nu kan der sendes meddelelser til serveren, som i dette tilfælde er en ekko-tjeneste, der blot returnerer den sendte streng. Strengen sendes afsted med metoden WebSocket.sendText. Svaret håndteres som sagt i listenerens onText-handler.
websocketFuture.join().sendText("Hvad drikker Møller?", true); // Vi venter lige på svar fra serveren, før vi slutter... Thread.sleep(10000);
Annotationer i lambda-udtryk
Java 11 kommer med endnu en nyhed for programmørerne, som dog er ganske minimal. Det går ud på at man i et lambda-udtryk, som f.eks.:
(x, y) -> x.process(y)
(hvor typerne er implicitte), kan skrive “var” foran, som indført i Java 10:
(var x, var y) -> x.process(y)
Det ser lidt dumt ud, men humlen er, at det er påkrævet, hvis der skal bruges annotationer i parameterlisten, som i
(@Nonnull var x, @Nullable var y) -> x.process(y)
- hvor annotationerne i dette eksempel kan sætte statiske værktøjer i stand til at vurdere, om der kan være null-referencer eller ej i kaldet.
Java som scripts
En ny skæg mulighed går ud på at afvikle Java-programmer, der består af en enkelt kildefil, ligesom et script i Unix-verdenen. Det vil sige, at man i et terminalvindue blot kan skrive:
java Program.java
- og så kompileres der til hukommelsen, hvorefter programmet afvikles.
Et nyt ‘flight recorder’-værktøj kan opsamle data under kørsel, med henblik på profilering og debugging, ved at indsætte specielle annotationer i koden. Det skulle give tæt på intet ydelsestab, når facilitaten er slået fra, og ikke mere end én procents tab, når den er slået til.
Resten af nyskabelserne har ikke så meget med den almindelige programmørs hverdag at gøre:
Gamle CORBA-klasser pilles ud af klassebibliotekerne. CORBA var en standard for interoperabilitet mellem objektorienterede sprog, som forlængst er afløst af SOAP, WS* og REST. Unicode opgraderes til den seneste udgave, nummer 10, og der kommer en ny, sjov garbage collector, Epsilon, der paradoksalt nok slet ikke gør noget som helst. Det kan anvendes til kortlivede mikrotjenester, hvor afviklingen er slut, længe før processen løber tør for hukommelse.
Blandt andre nyheder er forbedret ydelse på ARM 64-bit processorer og opdaterede kryptografiske biblioteker.
Java 11 står til udsendelse i slutningen af september, og api’erne er endnu ikke fastfrosset - det sker senest i midten af august. Det har formodentligt ikke den store betydning i denne omgang, da HTTP-klienten, som er den største nyhed, har været i test i flere år og næppe får api-ændringer i sidste øjeblik.
Eksemplet med HTTP-klienten kan downloades fra Gitlab, for det er vist det, de unge vil ha'. Der er mere information om Java 11 på projektets hjemmeside. Den endnu ufærdige version af Java 11 kan downloades her. Eksemplet er skrevet med build 18 og testet med det seneste build 19.

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