Sommeren står for døren, og dermed er det tid til en ny omgang Java. I denne halvårlige ombæring er ‘forseglede’ klasser og interfaces den store nyhed.
At skjule koden, såkaldt ‘code hiding,’ er en af objektorienteringens klassiske dyder.
På den måde afkobles et programs forskellige dele, så afhængigheder minimeres. Der kan skabes snitflader – api’er – ved at skelne mellem ‘privat’ og ‘offentlig’ kode, og mellem kode, der er beregnet på at skulle nedarves, og kode, der ikke er det.
I Java findes nøgleordet final
, der i forbindelse med klasser, interfaces og metoder betyder, at der ikke kan nedarves eller ‘overrides’ i en subklasse.
Nu tilføjes en facilitet for ‘forseglede’ klasser og interfaces, der ganske simpelt gør det muligt for en klasse at udpege præcist de subklasser, der må nedarve – og ingen andre.
I motivationen bag den nye facilitet, skriver Javas kloge hoved Brian Goetz, at når det handler om at genanvende kode, kan man som restriktion benytte adgangsniveauet package-private (som i class
), hvor kun subklasser i samme pakke kan få lov til at nedarve en superklasse.
»Men formålet med et klasseshierarki er ikke altid at genbruge kode. Nogle gange er dets formål at modellere de forskellige muligheder, der findes i et problemfelt, såsom den slags former, der understøttes af et grafikbibliotek eller de slags lånemuligheder, der understøttes af en finansiel applikation. Når klassehierarkiet bruges på denne måde, kan begrænsning af underklasser strømline modelleringen.«
Det kan se således ud:
De nedarvede klasser skal enten befinde sig i samme pakke eller samme modul som superklassen.
På et senere tidspunkt skal Javas pattern matching, der lige nu er på et tidligt stadie, kunne benytte en konstruktion som
Shape rotate(Shape shape, double angle) { return switch (shape) { case Circle c -> c; // no action needed case Rectangle r -> r.rotate(angle); case Square s -> s.rotate(angle); } }
– hvor compileren kan regne ud, at alle muligheder er dækket i forgreningen, på baggrund af de subklasser, som er angivet i Shape-klassen.
Forseglede klasser er et såkaldt ‘preview’, og det betyder at der skal compiles med flaget:
--enable-preview --release 15
Skjulte klasser
Lidt i samme genre er skjulte klasser, der dog ikke vil have den store betydning for den almindelige programmør, men derimod for dem, der skriver frameworks og værktøjer.
Skjulte klasser er klasser, der ikke kan bruges direkte af andre klasser. Skjulte klasser er beregnet til frameworks, der genererer klasser under kørselstid og bruger dem indirekte via refleksion, hvor felter og metoder altså ‘slås op’ programmatisk.
Mange sprog, der bygger på JVM, Javas virtuelle maskine, er afhængige af dynamisk klassegenerering for at opnå fleksibilitet og effektivitet. I Java oversættes et lambda-udtryk ikke til en dedikeret class-fil på kompileringstidspunktet, men genererer i stedet bytekode, der dynamisk skaber en klasse for et objekt, der svarer til lambda-udtrykket, men først når det er nødvendigt. Andre eksempler er dynamiske proxyer, som er klasser, der også genereres programmatisk ud fra en række interfaces.
I alle disse tilfælde ønsker programmørerne at klassen ikke kan findes med metoder som Class.forName
, samt adgangskontrol og kontrol over klassens levetid.
Det nye består i en udvidelse til Javas Lookup-api, så en skjult klasse kan defineres og kun tilgås ved hjælp af refleksion. JVM’en kan ikke linke til klassen og den kan ikke benyttes via classloaders. En skjult klasse kan også unloades, når den er ude af programmets virkefelter.
Ud med Javascript og ind med lav latency GC
Blandt andre nyheder i den nye udgave er ‘text blocks’, som kom med Java 13 – streng-konstanter, der løber over flere linjer – og den er nu ikke længere i preview, men færdig og klar til brug.
Records og indledende pattern matching for instanceof fra Java 14 er begge i second preview, så hvis alt går vel, skulle de to faciliteteter være færdigmodnede i den kommende Java 16.
Et api til adgang af hukommelse uden for den virtuelle maskine, så som det populære bibliotek Memcached, er nu i anden incubator-udgave. I modsætning til preview er incubator-projekter et vedhæng til klassebibliotekerne og kan fjernes igen på et senere tidspunkt.
To nye garbage collectors er nu produktionsmodne. Det drejer sig om ZGC og Shenandoah, der begge har lav forsinkelse under skraldeindsamlingen som mål. ZGC går efter pauser på under 10 millisekunder.
Javascript-motoren Nashorn fjernes. Den er for tung at vedligeholde og Oracles GraalVM kan nu byde på samme mulighed, men i C-implementering. Og så omskrives en række netværksbiblioteker.
Java 15 er sat til at udkomme i midten af september, og tidlige udgaver kan downloades fra projektets hjemmeside.