Efter seks måneders udvikling har Oracle udgivet Java SE 20-platformen (Java Platform, Standard Edition 20), hvor det åbne projekt OpenJDK anvendes som referenceimplementering. Bortset fra fjernelse af nogle forældede funktioner i Java SE 20 er bagudkompatibilitet med tidligere versioner af Java-platformen bevaret — de fleste tidligere skrevet Java-projekter vil fungere uden ændringer ved kørsel på den nye version. Installerbare builds af Java SE 20 (JDK, JRE og Server JRE) er forberedt til Linux (x86_64, AArch64), Windows (x86_64) og macOS (x86_64, AArch64). Den referenceimplementering af Java 20, der er udviklet inden for OpenJDK-projektet, er fuldstændig åben under GPLv2-licensen med undtagelser fra GNU ClassPath, der tillader dynamisk binding til kommercielle produkter.
Java SE 20 er klassificeret som en version med almindelig support, hvor opdateringer vil blive udgivet indtil næste udgivelse. Java SE 17 bør anvendes som en version med langtidssupport (LTS), hvor opdateringer vil blive udgivet indtil 2029. Det skal bemærkes, at siden udgivelsen af Java 10 er projektet skiftet til en ny udviklingsproces, som indebærer en kortere cyklus for oprettelse af nye udgivelser. Ny funktionalitet udvikles nu i en konstant opdateret master-gren, som inkluderer allerede færdige ændringer, og fra hvilken nye stabiliseringsgrene for udgivelser oprettes hver sjette måned.
Nye funktioner i Java 20 inkluderer:
- Foreslået er forhåndssupport af begrænsede værdier (Scoped Values), som muliggør deling af uforanderlige data i streams og effektiv datadeling mellem understreams (værdierne arves). Scoped Values udvikles til at erstatte mekanismen for trådlokale variabler (thread-local variables) og er mere effektive ved brug af et meget stort antal virtuelle tråde (tusinder og millioner af tråde). Den vigtigste forskel mellem Scoped Values og trådlokale variabler er, at de førstnævnte kun skrives én gang, derefter ikke kan ændres og kun er tilgængelige i hele trådens udførelse. class Server { final static ScopedValue CURRENT_USER = new ScopedValue(); void serve(Request request, Response response) { var level = (request.isAuthorized()? ADMIN : GUEST); var user = new User(level); ScopedValue.where(CURRENT_USER, user) .run(() -> Application.handle(request, response)); } } class DatabaseManager { DBConnection open() { var user = Server.CURRENT_USER.get(); if (!user.canOpen()) throw new InvalidUserException(); return new DBConnection(…); } }
- Anden forhåndsimplementation af record patterns er tilføjet, som udvider den nyligt fremkomne mulighed for mønstermatchning i Java 16 til at analysere værdier af record-type klasser. For eksempel: record Point(int x, int y) {} static void printSum(Object obj) { if (obj instanceof Point p) { int x = p.x(); int y = p.y(); System.out.println(x + y); } }
- Den fjerde forhåndsimplementering af mønstermatchning i ‘switch’-udtryk er tilføjet, hvilket gør det muligt at bruge fleksible mønstre i ‘case’-tags, der dækker en hel række værdier, som tidligere krævede tunge kæder af ‘if…else’-udtryk. static String formatterPatternSwitch(Object obj) { return switch (obj) { case Integer i -> String.format("int %d", i); 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 -> o.toString(); }; }
- Den anden forhåndsimplementering af FFM API (Foreign Function & Memory) er tilføjet, hvilket muliggør interaktion mellem Java-programmer og ekstern kode og data ved at kalde funktioner fra eksterne biblioteker og få adgang til hukommelse uden for JVM.
- Den anden forudgående version af virtuelle tråde er blevet tilføjet, som er letvægtstråde, der væsentligt forenkler skrivning og vedligeholdelse af højtydende multitrådede applikationer.
- Den anden version af et eksperimentelt API til struktureret parallelisme er blevet tilføjet, hvilket forenkler udviklingen af multitrådede applikationer ved at behandle flere opgaver, der udføres i forskellige tråde, som en enkelt blok.
- Den femte forudgående version af API Vector er blevet tilføjet, der tilbyder funktioner til vektorberegninger, der udføres ved hjælp af vektor-instruktioner fra x86_64 og AArch64 processorer og muliggør samtidig anvendelse af operationer på flere værdier (SIMD). I modsætning til de muligheder for automatisk vektorisering af skalaroperationer, der tilbydes i JIT-kompilatoren HotSpot, giver det nye API mulighed for eksplicit kontrol over vektorisering til parallel databehandling.
Kilde: opennet.ru
