Her er nyhederne i Java 11

29. juni 2018 kl. 05:128
Her er nyhederne i Java 11
Illustration: mkabakov/Bigstock.
Ny HTTP-klient og ud med CORBA er blandt godterne i den kommende udgave af Java.
Artiklen er ældre end 30 dage
Manglende links i teksten kan sandsynligvis findes i bunden af artiklen.

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.

Artiklen fortsætter efter annoncen

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.

  1. var client = HttpClient
  2. .newBuilder()
  3. .version(HttpClient.Version.HTTP_2)
  4. .build();
  5.  
  6. var request = HttpRequest
  7. .newBuilder()
  8. .uri(URI.create("https://http2.akamai.com/demo"))
  9. .build();
  10.  
  11. var response = client.send(request,
  12. HttpResponse.BodyHandlers.ofString());
  13. System.out.println("Fik denne HTTP-statuskode tilbage: "
  14. + response.statusCode());
  15. 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:

  1. var listener = new WebSocket.Listener() {
  2. public CompletionStage<?> onText(WebSocket webSocket,
  3. CharSequence message,
  4. boolean last) {
  5. System.out.println("Websocket-serveren svarede: " + message);
  6. assert message.equals("Hvad drikker Møller?");
  7. return null;
  8. }
  9. };
  10.  
  11. var websocketFuture = client.newWebSocketBuilder()
  12. .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.

  1. websocketFuture.join().sendText("Hvad drikker Møller?", true);
  2.  
  3. // Vi venter lige på svar fra serveren, før vi slutter...
  4. 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.:

  1. (x, y) -> x.process(y)

(hvor typerne er implicitte), kan skrive “var” foran, som indført i Java 10:

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

  1. (@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:

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

Artiklen fortsætter efter annoncen

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.

8 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
8
3. juli 2018 kl. 22:46

Jeg læste nu Tanias indlæg som en kommentar til at mange overvejer, eller allerede har gennemført, et skifte fra GitHub til GitLab som følge af Microsofts nylige overtagelse af GitHub.

Det kan også sagtens tænkes. Der har dog været kommentarer tidligere, og GitLab linket til denne artikel er stadig en .zip - så jeg tænkte at Tania måske ikke havde fanget hvorfor der tidligere blev foreslået GitHub. Min egen kommentar på tidligere artikel kunne have været mere hjælpsomt formuleret :)

6
3. juli 2018 kl. 12:44

Eksemplet med HTTP-klienten kan downloades fra Gitlab, for det er vist det, de unge vil ha'.

Hej Tania,

Det er ikke så meget hvor koden kan hentes fra, der er det afgørende – det folk gerne vil have fra Gitlab eller GitHub er de features platformene tilbyder... som totalt bliver misset, hvis du bare uploader en .zip :-)

Det er features som fx versionshistorik, at kunne se de enkelte filer online uden at skulle downloade, nemt at kunne klone et repository og lave sine egne eksperimenter.

4
2. juli 2018 kl. 12:00

Mens vi er ved mangler, hvorfor er der endnu ikke pattern matching i sproget?

2
29. juni 2018 kl. 11:51

Der arbejdes stadig på specifikationen, så vidt jeg forstår. Så det er ikke taget af brættet.

Mvh Tania/V2

1
29. juni 2018 kl. 11:46

Stadig ingen structs? Hvorfor ikke egentlig?