Her er Java 12’s nye Switch

Illustration: mkabakov/Bigstock
En ny switch-sætning hopper direkte til slut og kan returnere værdier.

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.

Læs også: Vi skaber exe-programmer fra Java med GraalVM - og det kører forrygende hurtigt

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.

Tips og korrekturforslag til denne historie sendes til tip@version2.dk
Følg forløbet
Kommentarer (10)
sortSortér kommentarer
  • Ældste først
  • Nyeste først
  • Bedste først
Palle Simonsen

men jeg mister utroligt nemt overblikket med alle de paranteser.

Det er der at din editor hjælper dig :)
Moderne editorer som sublime vscode etc. kan alle sammen holde styr på det.

I tidligere tider var der structure editors i interlisp-d miljøet og interlisp havde også superparantesen ], der aflsuttede alle udestående paranteser.

En moderne lisp som Commonlisp og selv Clojure med sin lettere bastarderede syntax, er nem at finde rundt i.

Palle Simonsen

Så prøv et funktionsprogrammeringssprog som har en mere traditionel syntaks

Her synes jeg Paul Graham 'nailer' det fint:

It's worth understanding what McCarthy discovered, not just as a landmark in the history of computers, but as a model for what programming is tending to become in our own time. It seems to me that there have been two really clean, consistent models of programming so far: the C model and the Lisp model. These two seem points of high ground, with swampy lowlands between them.
As computers have grown more powerful, the new languages being developed have been moving steadily toward the Lisp model. A popular recipe for new programming languages in the past 20 years has been to take the C model of computing and add to it, piecemeal, parts taken from the Lisp model, like runtime typing and garbage collection

Paul Grahams artikel er ganske to mod McCarthy's oprindelige beskrivelse og er ganske fornøjelig at læse. 13 sider med tilpas whitespace og kodeeksempler:

http://languagelog.ldc.upenn.edu/myl/llog/jmc.pdf

Log ind eller Opret konto for at kommentere
Brugerundersøgelse Version2
maximize minimize