Pas pas gjasht muajsh zhvillimi, kompania Oracle publikoi platformën Java SE 23 (Java Platform, Standard Edition 23), si një realizim referimi për të cilën përdoret projekti i hapur OpenJDK. Përveç eliminimit të disa mundësive të vjetruara, Java SE 23 mban përputhshmërinë e pasme me versionet e mëparshme të platformës Java - shumica e projekteve Java të shkruara më parë do të funksionojnë pa ndryshime nën menaxhimin e versionit të ri. Ndërtimet e gatshme për instalim të Java SE 22 (JDK, JRE dhe Server JRE) janë përgatitur për Linux (x86_64, AArch64), Windows (x86_64) dhe macOS (x86_64, AArch64). Realizimi referencial i Java 23, i zhvilluar në kuadër të projektit OpenJDK, është plotësisht i hapur nën licencën GPLv2 me përjashtime të GNU ClassPath, që lejojnë lidhjen dinamike me produkte komerciale.
Java SE 23 i përket kategorisë së lëshimeve me një periudhë të zakonshme mbështetje, përditësimet e të cilit do të lëshohen deri në lëshimin e ardhshëm. Si një degë me një periudhë të gjatë mbështetjeje (LTS), duhet të përdoret Java SE 21 ose Java SE 17, përditësimet e të cilave do të lëshohen deri në vitet 2031 dhe 2029 përkatësisht (publike deri në vitet 2028 dhe 2026). Mbështetje e zgjeruar për degën LTS të Java SE 8 do të zgjasë deri në vitin 2030, ndërsa Java SE 11 deri në vitin 2032.
Në mesin e risive të propozuara në Java SE 23:
- Modi gjenerues i mbledhësit të mbetjeve ZGC (Generational Z Garbage Collector) është përfshirë si paraprakisht, duke përdorur përpunim të ndarë të objekteve "të vjetra" dhe "të reja", duke rritur efikasitetin e pastrimit të objekteve të sapo krijuara me një jetëgjatësi të shkurtër. Përdorimi i Generational ZGC zvogëlon rreziqet gjatë ndarjes së burimeve, ul ngarkesën në CPU dhe konsumin e memories gjatë mbledhjes së mbetjeve. Testimi i Generational ZGC me Apache Cassandra 4 tregoi një rritje të kapacitetit prej 4 herë me një madhësi të caktuar të heap-it dhe një zvogëlim të madhësisë së heap-it me një të katërt, duke mbajtur të pandryshuar kapacitetin.
- JavaDoc ka shtuar mbështetje për përdorimin e markueseve Markdown për dokumentimin e kodit në komentet, të cilat mund të përdoren në vend të një përzierjeje të HTML dhe @-etiketave të JavaDoc.

- Mekanizmat e përputhjes janë zgjeruar me mbështetje të përparuar për përdorimin e tipeve primitive (int, byte, char dhe tipe të tjera themelore që nuk janë objekte) në të gjitha format e shablloneve, në operatorin «instanceof» dhe në blloqet «switch». switch (x.getStatus()) { case 0 -> «mirë»; case 1 -> «kërkesë»; case 2 -> «gabim»; case int i -> «status i panjohur: » + i; } if (i instanceof byte b) { ⊠b ⊠}
- Shtuar mbështetje të përparuar për përdorimin e një shprehjeje «import module M» për të importuar menjëherë të gjithë paketat që eksportohen nga moduli i caktuar. Ky ndryshim e thjeshton ndjeshëm ri-përdorimin e bibliotekave modulare, duke lejuar lidhjen e bibliotekave dhe klasave pa përcaktimin e vendit të tyre në hierarkinë e paketave. Për shembull, përcaktimi «import module java.base» do të çojë në importimin e të 54 paketeve që përfshihen në modul java.base, të cilat dikur do të duheshin përmendur veç e veç («import java.io.*», «import java.util.*» etj.).
Propozuar një implementim të dytë të përparuar të API Class-File për analizimin, gjenerimin dhe transformimin e skedarëve me klasa Java. 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); } } });
- Propozuar një implementim të tetë të përparuar të API Vector, që ofron funksione për llogaritjet vektoriale, të cilat ekzekutohen duke përdorur instrukcionet vektoriale të procesorëve x86_64 dhe AArch64 dhe lejojnë aplikimin e operacioneve menjëherë në disa vlera (SIMD). Në krahasim me mundësitë e ofruara nga kompaktori JIT HotSpot për avtokompleksifikimin e operacioneve skalar, API i ri ofron mundësinë për të menaxhuar qartë vektorizimin për përpunimin paralel të të dhënave.
- Në klasën java.io.Console janë shtuar metodat format, printf, readPassword dhe readLine për formatimin, daljen dhe leximin e tekstit në përputhje me lokalitetin e zgjedhur. System.console().printf(Locale.FRANCE, «%1$tY-%1$tB-%1$te %1$tA», new Date()) 2024-mai-16 e enjte
- Shtuar një implementim të dytë paraprak të API-së së zgjeruar Stream, që mbështet përcaktimin e operacioneve të ndërmjetme të personalizuara, të cilat mund të jenë të dobishme në raste kur operacionet e ndërmjetme të ndërtuara nuk janë të mjaftueshme për transformimin e dëshiruar të të dhënave. Pjesëtarët e personalizuar lidhen përmes një operacioni të ri të ndërmjetëm Stream::gather(Gatherer), i cili përpunon elementët e rrjedhës duke u aplikuar atyre një trajtim të përcaktuar nga përdoruesi. 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}}
- Shtuar një implementim të tretë paraprak të klasave të shpallura implicit dhe instancave anonim të metodës "main", në të cilat mund të kaloni pa shpalljet public/static, kalimin e një vargu argumentesh dhe entitete të tjera të lidhura me shpalljen e klasës. // ishte public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // tani mund të jetë void main() { System.out.println("Hello, World!"); }
- Shtuar një variant të dytë paraprak të mundësive që lejojnë përcaktimin në konstruktorë të shprehjeve para thirrjes super(...), e cila përdoret për thirrjen eksplicite të konstruktorit të klasës prind nga konstruktor i klasës trashëguese, nëse këto shprehje nuk referohen në instancën e krijuar nga konstruktor. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Shtuar një implementim të tretë paraprak të vlerave të kufizuara (Scoped Values), që lejojnë ndarjen e të dhënave të pa ndryshueshme në RRJEDHA dhe këmbimin efikas të të dhënave midis rrjedhave fëmijë (vlerat trashëgohen). Vlerat e Kufizuara po zhvillohen për të zëvendësuar mekanizmin e variablave lokale për rrjedhën (thread-local variables) dhe janë më efikase në përdorimin e një numri shumë të madh të rrjedhave virtuale (mijëra dhe miliona rrjedha). Diferenca kryesore midis Vlerave të Kufizuara dhe variablave lokalë për rrjedhën është se të parat shkruhen një herë, më pas nuk mund të ndryshohen dhe mbeten të disponueshme vetëm gjatë ekzekutimit të rrjedhës.
- Propozuar për testim është varianti i tretë paraprak i API për paralelizmin e strukturuar (Structured Concurrency), i cili thjeshton zhvillimin e aplikacioneve me shumë thread-e duke trajtuar disa detyra që realizohen në thread-e të ndryshme si një njësi të vetme.
- Metodat për qasje në memorien e jashtme (jashtë JVM) të ofruara nga klasa sun.misc.Unsafe janë shpallur të vjetra dhe planifikuar për t'u fshirë. Për të adresuar memorien jashtë heap-it dhe për të bashkëpunuar me kodin e jashtëm, rekomandohet të përdoret API VarHandle dhe API FFM (Foreign Function & Memory).
Gjithashtu mund të theksohet publikimi i update-it të platformës për krijimin e aplikacioneve me ndërfaqe grafike JavaFX 23 dhe përfshirja e një ekipi të plotë të Oracle JDK 23 JIT-kompilatorit GraalVM.
Po ashtu është prezantuar një version i ri i makinerisë universale GraalVM, që mbështet ekzekutimin e aplikacioneve në JavaScript (Node.js), Python, Ruby, R, të gjitha gjuhët për JVM (Java, Scala, Clojure, Kotlin) dhe gjuhët për të cilat mund të formohet bitcode LLVM (C, C++, Rust). Përveç mbështetjes për JDK 23, në këtë version është optimizuar konsumi i memorjes dhe përmasat e kodit ekzekutues, ndërsa është realizuar një mbështetje e plotë për mjete për integrimin e Python dhe WebAssembly në kodin Java duke përdorur JIT-kompilimin.
Burimi: opennet.ru

