Efter sex mĂ„naders utveckling har Oracle publicerat plattformen Java SE 23 (Java Platform, Standard Edition 23), dĂ€r OpenJDK anvĂ€nds som referensimplementation. Förutom att vissa förĂ„ldrade funktioner har tagits bort bevaras bakĂ„tkompatibiliteten med tidigare versioner av Java-plattformen i Java SE 23 â de flesta tidigare skrivna Java-projekt kommer att fungera utan Ă€ndringar vid körning under den nya versionen. Installerbara versioner av Java SE 22 (JDK, JRE och Server JRE) Ă€r tillgĂ€ngliga för Linux (x86_64, AArch64), Windows (x86_64) och macOS (x86_64, AArch64). Den referensimplementation av Java 23 som utvecklats inom ramen för OpenJDK-projektet Ă€r helt öppen under GPLv2-licensen med undantag för GNU ClassPath, som tillĂ„ter dynamisk lĂ€nkning med kommersiella produkter.
Java SE 23 klassificeras som en version med vanlig supportperiod, dÀr uppdateringar kommer att slÀppas fram till nÀsta version. För lÄngsiktig support (LTS) bör Java SE 21 eller Java SE 17 anvÀndas, med uppdateringar som kommer att slÀppas fram till 2031 respektive 2029 (allmÀnt tillgÀngliga till 2028 och 2026). Den utökade supporten för LTS-versionen av Java SE 8 kommer att pÄgÄ till 2030, medan Java SE 11 kommer att stödjas fram till 2032.
Bland nyheterna i Java SE 23:
- Generativ lÀge för ZGC (Generational Z Garbage Collector) Àr nu aktiverat som standard, vilket anvÀnder separat hantering av "gamla" och "unga" objekt för att öka effektiviteten av rensning av nyligen skapade objekt med kort livslÀngd. AnvÀndningen av Generational ZGC minskar risken för pauser under resursallokering och sÀnker CPU-belastningen samt minnesförbrukningen vid skrÀphantering. Testning av Generational ZGC med Apache Cassandra 4 visade en fyrfaldig ökning av genomströmning vid konstant storlek pÄ heap och en minskning av heap-storleken med en fjÀrdedel vid oförÀndrad genomströmning.
- JavaDoc har fÄtt stöd för att anvÀnda Markdown-syntax för att dokumentera kod i kommentarer, vilket kan anvÀndas istÀllet för en blandning av HTML och @-taggar i JavaDoc.

- Mekanismen för mönsterigenkÀnning har utvidgats med preliminÀrt stöd för anvÀndning av primitiva typer (int, byte, char och andra grundlÀggande typer som inte Àr objekt) i alla typer av mallar, i operatorn "instanceof" och i "switch"-block. switch (x.getStatus()) { case 0 -> "okay"; case 1 -> "warning"; case 2 -> "error"; case int i -> "unknown status: " + i; } if (i instanceof byte b) { ⊠b ⊠}
- PreliminĂ€rt stöd har lagts till för att anvĂ€nda ett uttryck "import module M" för att importera alla paket som exporteras av det angivna modul. Ăndringen förenklar avsevĂ€rt Ă„teranvĂ€ndning av modulbibliotek, vilket gör det möjligt att ansluta bibliotek och klasser utan att specificera deras plats i paketets hierarki. Till exempel kommer angivandet av "import module java.base" att importera alla 54 paket som ingĂ„r i modulen java.base, som tidigare skulle behöva nĂ€mnas separat ("import java.io.*", "import java.util.*" etc.).
En andra preliminÀr implementation av API:et Class-File för att analysera, generera och konvertera Java-klassfiler har föreslagits. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue().startsWith("debug"))) { classBuilder.with(ce); } } });
- En Ättonde preliminÀr implementation av API:et Vector som tillhandahÄller funktioner för vektorberÀkningar har föreslagits, dÀr berÀkningarna utförs med hjÀlp av vektorinstruktioner frÄn processorer x86_64 och AArch64, vilket möjliggör att flera vÀrden kan bearbetas samtidigt (SIMD). Till skillnad frÄn de möjligheter som erbjuds av JIT-kompilatorn HotSpot för autovektorisering av skalÀra operationer, ger det nya API:et möjlighet att explicit styra vektorising för parallell databehandling.
- Metoderna format, printf, readPassword och readLine för klass java.io.Console har lagts till för att formatera, skriva ut och lÀsa text med hÀnsyn till vald lokal. System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", new Date()) 2024-mai-16 torsdag
- Den andra förhandsversionen av det utvidgade Stream API har lagts till, vilket stödjer definiering av egna mellanliggande operationer som kan vara anvÀndbara i de fall dÀr de befintliga inbyggda mellanliggande operationerna inte rÀcker till för önskad datakonvertering. Egna handlare kopplas in med hjÀlp av den nya mellanliggande operationen Stream::gather(Gatherer), som bearbetar strömelement genom att tillÀmpa en anvÀndardefinierad handlare. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==>> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- Den tredje förhandsversionen av implicit deklarerade klasser och anonyma instanser av metoden "main" har lagts till, dÀr man kan klara sig utan deklarationer sÄsom public/static, överföring av argumentarray och andra entiteter relaterade till klassdeklarationen. // tidigare public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // nu kan man void main() { System.out.println("Hello, World!"); }
- Den andra förhandsversionen har lagts till av en funktionalitet som tillÄter angivande av uttryck i konstruktorer före anropet av super(...), som anvÀnds för att explicit anropa förÀldraklassens konstruktor frÄn den Àrvda klassens konstruktor, om dessa uttryck inte refererar till instansen som skapats av konstruktorn. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Den tredje förhandsversionen av Scoped Values har lagts till, vilket tillÄter delning av oförÀnderliga data mellan trÄdar och effektivt utbyte av data mellan barntrÄdar (vÀrden Àrver). Scoped Values utvecklas för att ersÀtta mekanismen för trÄd-lokala variabler (thread-local variables) och Àr mer effektiva nÀr det anvÀnds ett mycket stort antal virtuella trÄdar (tusentals och miljontals trÄdar). Den huvudsakliga skillnaden mellan Scoped Values och trÄd-lokala variabler Àr att de förstnÀmnda skrivs en gÄng, kan inte Àndras i framtiden och förblir endast tillgÀngliga under trÄdens körning.
- Den tredje preliminÀra API-versionen för strukturerad samtidighet (Structured Concurrency) som föreslÄs för testning förenklar utvecklingen av flertrÄdiga applikationer genom att hantera flera uppgifter som körs i olika trÄdar som en enhetlig block.
- Metoder för Ätkomst till extern minne (utanför JVM) som tillhandahÄlls av klassen sun.misc.Unsafe har förklarats som förÄldrade och planeras att tas bort. För Ätkomst till minne utanför heapen och interaktion med extern kod rekommenderas API:erna VarHandle och FFM (Foreign Function & Memory).
Dessutom kan nÀmnas publiceringen av plattformsuppdateringen för att skapa applikationer med grafiskt anvÀndargrÀnssnitt JavaFX 23 och inkluderingen av JIT-kompilatorn GraalVM i Oracle JDK 23.
Ăven en ny version av den universella virtuella maskinen GraalVM har presenterats, som stöder körning av applikationer i JavaScript (Node.js), Python, Ruby, R, alla sprĂ„k för JVM (Java, Scala, Clojure, Kotlin) samt sprĂ„k för vilka LLVM-bitkod kan genereras (C, C++, Rust). Förutom att stödja JDK 23 har den nya versionen optimerat minnesanvĂ€ndning och storlek pĂ„ exekveringskod, med fullstĂ€ndigt stöd för att integrera Python och WebAssembly i Java-kod med hjĂ€lp av JIT-kompilering.
KĂ€lla: opennet.ru

