Slankekure er mange steder på dagsordenen her i årets første måneder.
Det samme gælder åbenbart for Java 12, der bliver en historisk slank kommende opdatering af sproget, og som løber af stablen om kort tid.
Java 12 var i efteråret nede på to nyheder i forhold til til selve sproget.
Den ene nyhed var 'raw literals,' som er streng-konstanter, der løber over flere linjer, som det kendes fra mange andre sprog.
Denne funktion er især god til Oracles nye GraalVM, der kommer med understøttelse af sprog som Python og Javascript, men i C-baserede udgaver, i modsætning til JVM-implementeringer af sprogene. Med Graal kan kode i disse sprog kaldes fra Java-kode uden yderligere krumspring, og det ser pænest ud, hvis det kan gøres med en facilitet, hvor en streng kan løbe over flere linjer i kildekoden.
Nyheden var programsat til Java 12, men i sidste øjeblik pillede Oracles top-Java-guru Brian Goetz faciliteten af listen over køreklare nyheder. Den nuværende udformning var ikke moden til udgivelse, mente han, og undskyldte behørigt.
Den anden nyhed er en ny switch-sætning, der på et senere tidspunkt skal munde ud i 'pattern matching,' som det kendes fra funktionelle sprog. Det vil give mulighed for at foretage forgreninger baseret på variablers typer. Brian Goetz har givet et bud på, hvordan faciliteten kan ende med at se ud:
String formatted = switch (obj) { case Integer i -> String.format("int %d", i); case Byte b -> String.format("byte %d", b); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s, s); default -> String.format("Object %s", obj); }; ...
Det ligger så længere ude i fremtiden. I første gang kommer en ny syntaks for Javas switch.
Case- eller Switch-sætninger er som bekendt en slags ‘if’ med flere muligheder.
Der er dog i Java 12 tale om en såkaldt 'preview feature'-udgave, hvor der åbnes en kattelem for, at udformningen kan ændres i kommende udgaver.
Men preview features kan slet ikke kompileres på almindelig vis. Man skal bruge flagene:
--enable-preview --release 12
– under kompilering, for at benytte den nye facilitet. Så det kommer næppe til at slå an som en løbeild, men vi tager et kig alligevel.
Ingen 'fald-igennem'
Den tidligere udgave af switch virker stadig, men den nye ser i sin simple form således ud:
var k = 2; switch (k) { case 1 -> System.out.println("one"); case 2 -> System.out.println("two"); case 3 -> System.out.println("many"); }
Pil-operatoren kendes fra Javas closures og har en anden opførsel end switch's gamle kolon. Javas klassiske switch har nemlig den drilske ‘fall through’-adfærd: Hvis man glemmer at skrive
break
efter en sætning, bliver den næste case-sætning også udført. Det kan give mening i visse tilfælde, men det kan også føre til fejl.Den nye pileoperator udfører kun sætningen på den anden side af pilen, og hopper derefter direkte til den afsluttende tuborg-parentes.
Switch er nu heller ikke længere en sætning, men et udtryk. Den kan altså returnere en værdi. Det kan enten være værdien på den anden side af pilen, og hvis der er en blok, kan break
værdi/udtryk
benyttes til at sætte resultatet, som i eksemplet herunder:
final var MONDAY = "monday"; final var TUESDAY = "tuesday"; var day = "wednesday"; int j = switch (day) { case MONDAY -> 6; case TUESDAY -> 7; default -> { int result = day.toString().length(); break result; } }; System.out.println(j);
Der er mere information om den nye switch-sætning på JDK-hjemmesiden.
De øvrige nyheder i Java 12 har at gøre med JVM'en, som eksempelvis en ny garbage collector, hvor de pauser, som opstår i programmet ved genindvinding af hukommelse, er meget små.
Class data-sharing, hvor et sæt klasser indlæses fra system-jarfilen til en intern repræsentation og dumpes til en fil på disk, kaldet et fælles arkiv, er nu standard. Det betyder, at opstartstiden for små programmer øges væsentligt, med en reduktion på 55 til 60 procent i tid. Det er især anvendeligt til brug i skyen.
En mikro-benchmark-suite er nu en del af JDK'et. Det skal anvendes til test af JDK'ets ydelse, men kan også benyttes til andre programmer. Det bygger på biblioteket Java Microbenchmark Harness, hvor koden udstyres med annotationer, der instrumenterer måling af tidtagningen.
Java 12 er næsten færdig og lander d. 19. marts. Den foreløbige udgave kan findes på projektets hjemmeside. Testeksemplerne i denne artikel er skrevet med build 30 og kan hentes her.