Pas pas gjashtĂ« muajsh zhvillimi, kompania Oracle publikoi platformĂ«n Java SE 23 (Java Platform, Standard Edition 23), me projektin e hapur OpenJDK si implementimin referencĂ«. PĂ«rveç largimit tĂ« disa funksionaliteteve tĂ« vjetra, Java SE 23 ruan kompaktibilitetin me lĂ«shimet e mĂ«parshme tĂ« platformĂ«s Java â shumica e projekteve tĂ« Java tĂ« shkruara mĂ« parĂ« do tĂ« funksionojnĂ« pa ndryshime nĂ«n versionin e ri. Paketat 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). Implementimi i referencĂ«s Java 23, i zhvilluar nĂ«n projektin OpenJDK, Ă«shtĂ« plotĂ«sisht i hapur nĂ«n licencĂ«n GPLv2 me pĂ«rjashtimet e GNU ClassPath, qĂ« lejojnĂ« lidhjen dinamike me produkte komerciale.
Java SE 23 është klasifikuar si një lëshim me jetëgjatësi mbështetjeje të zakonshme, për të cilin përditësimet do të lëshohen deri në lëshimin e ardhshëm. Si deg më të gjatë të mbështetjes (LTS), duhet të përdoret Java SE 21 ose Java SE 17, për të cilat përditësimet do të lëshohen deri në vitin 2031 dhe 2029 përkatësisht (të qasshme 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.
Ndër risitë e propozuara në Java SE 23 janë:
- Gjeneratori i kolektorit të plehrave ZGC (Generational Z Garbage Collector) është përfshirë me default, që përdor përpunim të ndarë për objektet "e vjetra" dhe "të reja", duke rritur efikasitetin e pastrimit të objekteve të sapo krijuara me jetë të shkurtër. Përdorimi i Generational ZGC redukton rrezikun e ndalimeve gjatë alokimit të burimeve, ul ngarkesën në CPU dhe konsumimin e memories gjatë koleksionit të plehrave. Testimi i Generational ZGC me Apache Cassandra 4 tregoi një rritje të kapacitetit deri në 4 herë me një madhësi të fiksuar të heap-it dhe një ulje të madhësisë së heap-it me një të katërt pa ndryshuar kapacitetin.
- Në JavaDoc është shtuar mbështetje për përdorimin e shenjës Markdown për dokumentimin e kodit në komente, e cila mund të përdoret në vend të një përzierjeje të HTML dhe @-labels të JavaDoc.

- Mekanizmat për përputhje me modele janë zgjeruar me mbështetje të përparuar për përdorimin e tipeve primarë (int, byte, char dhe tipe të tjera themelore që nuk janë objekte) në të gjitha llojet e shablloneve, në operatorin "instanceof" dhe në blloqet "switch". switch (x.getStatus()) { case 0 -> "okay"; case 1 -> "warning"; case 2 -> "error"; case int i -> "unknown status: " + i; } if (i instanceof byte b) { ⊠b ⊠}
- ĂshtĂ« shtuar mbĂ«shtetje e pĂ«rparuar pĂ«r pĂ«rdorimin e njĂ« shprehjeje "import module M" pĂ«r tĂ« importuar menjĂ«herĂ« tĂ« gjitha paketat qĂ« eksportohen nga moduli i caktuar. Ky ndryshim e thjeshton ndjeshĂ«m ripĂ«rdorimin e biblioteka modulore, duke lejuar lidhjen e bibliotekave dhe klasave pa caktuar vendin e tyre nĂ« hierarkinĂ« e paketave. PĂ«r shembull, pĂ«rcaktimi i "import module java.base" do tĂ« importojĂ« tĂ« gjitha 54 paketat qĂ« pĂ«rfshihen nĂ« modul java.base, tĂ« cilat mĂ« parĂ« do tĂ« duhej tĂ« pĂ«rmendeshin veç e veç ("import java.io.*", "import java.util.*" etj.).
Propozohet një implementim i dytë i përparuar i API Class-File për analizën, 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); } } });
- Propozohet një implementim i tetë i përparuar i API Vector, që ofron funksione për llogaritje vektoriale, të cilat realizohen duke përdorur instruksionet vektoriale të procesorëve x86_64 dhe AArch64 dhe lejojnë aplikimin e operacioneve njëkohësisht mbi disa vlera (SIMD). Në krahasim me mundësitë e ofruara në kompilatorin JIT HotSpot për avto-vektorimin e operacioneve skalarë, API-i i ri ofron mundësinë për të menaxhuar drejtpërsëdrejti 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, shfaqjen dhe leximin e tekstit me përmirësimin e lokalizimit të zgjedhur. System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", new Date()) 2024-mai-16 enjte
- Një implementim i dytë i përparuar i API Stream është shtuar, që mbështet përcaktimin e operacioneve të përkohshme të përdoruesit, të cilat mund të jenë të dobishme kur operacionet e ndërtuara të përkohshme janë të pamjaftueshme për transformimin e dëshiruara të të dhënave. Procesorët e personalizuar lidhen përmes një operacioni të ri të përkohshëm Stream::gather(Gatherer), i cili trajton elementët e rrjedhës dhe u aplikon atyre procesorin e specifikuar 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]]
- I është shtuar një realizim i tretë i paracaktuar i klasave që nuk janë shpallur shprehimisht dhe instancave pa emër të metodës «main», në të cilat mund të kaloni pa shpalljet public/static, kalimin e një array 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!»); }
- I Ă«shtĂ« shtuar njĂ« variant i dytĂ« i mundĂ«sisĂ«, i cili lejon specifikimin nĂ« konstruktore tĂ« shprehjeve para thirrjes sĂ« super(âŠ), e cila pĂ«rdoret pĂ«r tĂ« thirrur qartĂ« konstruktorin e klasĂ«s prind nga konstruktorja e klasĂ«s trashĂ«guese, nĂ«se kĂ«to shprehje nuk i referohen instancĂ«s sĂ« krijuar nga konstruktori. class Outer { void hello() { System.out.println(«Hello»); } class Inner { Inner() { hello(); super(); } } }
- I është shtuar një realizim i tretë i vlerave të kufizuara (Scoped Values), të cilat lejojnë ndarjen e të dhënave të pandryshueshme në rrjedha dhe transferimin efikas të të dhënave ndërmjet nën-rrjedhave (vlerat trashëgohen). Vlerat e kufizuara po zhvillohen për të zëvendësuar mekanizmin e variablave lokalë të rrjedhës (thread-local variables) dhe janë më efikase kur përdoren një numër të madh virtuel rrjedhash (mijëra dhe miliona rrjedha). Dallimi kryesor i Vlerave të Kufizuara nga variablat lokalë të rrjedhës është se ato shkruhen një herë, nuk mund të ndryshohen më dhe mbeten të aksesueshme vetëm gjatë ekzekutimit të rrjedhës.
- është propozuar për testim një variant i tretë i API për paralelizmin e strukturuar (Structured Concurrency), që thjeshton zhvillimin e aplikacioneve me shumë rrjedha duke trajtuar disa detyra që ekzekutohen në rrjedha të ndryshme, si një bllok të vetëm.
- I janë shpallur të vjetëruar dhe janë planifikuar për t'u hequr metodat aksesit në memorjen jashtë (jashtë JVM), të ofruara nga klasa sun.misc.Unsafe. Për qasjen në memorjen jashtë grumbullit (off-heap) dhe bashkëpunimin me kodin e jashtëm, rekomandohet përdorimi i API VarHandle dhe API FFM (Foreign Function & Memory).
Gjithashtu, mund të përmendet publikimi i një azhurnimi të platformës për krijimin e aplikacioneve me ndërfaqe grafike JavaFX 23 dhe përfshirja në paketimin e Oracle JDK 23 të kompilatorit JIT GraalVM.
Po ashtu, është paraqitur një lëshim i ri të makinerisë virtuale universale GraalVM, e cila mbështet ekzekutimin e aplikacioneve në JavaScript (Node.js), Python, Ruby, R, çdo gjuhë për JVM (Java, Scala, Clojure, Kotlin) dhe gjuhë për të cilat mund të formohet bitcode LLVM (C, C++, Rust). Përveç mbështetjes për JDK 23, në versionin e ri është optimizuar konsumimi i memories dhe madhësia e kodit ekzekutues, si dhe është realizuar mbështetje e plotë për mjetet për integrimin e Python dhe WebAssembly në kodin Java duke përdorur JIT-kompilimin.
Burimi: opennet.ru

