Pas gjashtë muajsh zhvillimi, Oracle publikoi platformën Java SE 23 (Java Platform, Standard Edition 23), e cila përdor projektin OpenJDK me burim të hapur si një zbatim referimi. Me përjashtim të heqjes së disa veçorive të vjetruara, Java SE 23 ruan përputhshmërinë e prapambetur me versionet e mëparshme të platformës Java - shumica e projekteve Java të shkruara më parë do të funksionojnë pa ndryshime kur ekzekutohen sipas 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). Zhvilluar nga projekti OpenJDK, zbatimi i referencës Java 23 është plotësisht me burim të hapur nën licencën GPLv2, me përjashtime të GNU ClassPath që lejojnë lidhjen dinamike me produktet komerciale.
Java SE 23 klasifikohet si një version i rregullt mbështetës dhe do të vazhdojë të marrë përditësime deri në versionin tjetër. Dega Long Term Support (LTS) duhet të jetë Java SE 21 ose Java SE 17, të cilat do të marrin përditësime përkatësisht deri në 2031 dhe 2029 (përgjithësisht të disponueshme deri në 2028 dhe 2026). Mbështetja e zgjeruar për degën LTS të Java SE 8 do të zgjasë deri në vitin 2030 dhe Java SE 11 deri në 2032.
Ndër 23 risitë e propozuara në Java SE:
- Mënyra gjeneruese e funksionimit të kolektorit të mbeturinave ZGC (Generation Z Garbage Collector) është aktivizuar si parazgjedhje, duke përdorur përpunim të veçantë të objekteve "të vjetra" dhe "të rinj", gjë që rrit efikasitetin e pastrimit të objekteve të krijuara së fundmi me një jetëgjatësi të shkurtër. Përdorimi i gjeneratës së ZGC zvogëlon rrezikun e ngecjeve gjatë shpërndarjes së burimeve, zvogëlon ngarkesën e CPU-së dhe konsumin e memories gjatë mbledhjes së mbeturinave. Testimi i gjeneratës së ZGC me Apache Cassandra 4 tregoi një rritje 4 herë në xhiron me një madhësi fikse grumbulli dhe një çerek ulje në madhësinë e grumbullit me xhiro konstante.
- JavaDoc ka shtuar mbështetje për përdorimin e Markdown për të dokumentuar kodin në komente, i cili mund të përdoret në vend të një përzierjeje të etiketave HTML dhe JavaDoc @.

- Mekanizmat e përputhjes së modeleve janë përmirësuar me mbështetje paraprake për përdorimin e llojeve primitive (int, byte, char dhe lloje të tjera bazë jo-objekte) në të gjitha llojet e shablloneve, në deklaratën "instanceof" dhe në blloqet "switch". switch (x.getStatus()) { case 0 -> "në rregull"; rasti 1 -> “paralajmërim”; rasti 2 -> “gabim”; case int i -> “status i panjohur: ” + i; } nëse (i shembulli i bajtit b) { … b … }
- U shtua mbështetje paraprake për përdorimin e një deklarate të vetme "import moduli M" për të importuar të gjitha paketat e eksportuara nga një modul i specifikuar menjëherë. Ndryshimi thjeshton ndjeshëm ripërdorimin e bibliotekave modulare, duke ju lejuar të përfshini bibliotekat dhe klasat pa përcaktuar vendin e tyre në hierarkinë e paketave. Për shembull, specifikimi i "import modulit java.base" do të importojë të gjitha 54 paketat e përfshira në modulin java.base, të cilat më parë do të duhej të përmendeshin veçmas ("import java.io.*", "import java.util.*" ” etj.).
Një zbatim i dytë paraprak i API-së Class-File është propozuar për analizimin, gjenerimin dhe konvertimin e skedarëve të klasës Java. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce shembulli MethodModel mm && mm.methodName().stringValue(). startsWith("debug"))) { classBuilder.with(ce);
- Paraafishimi i tetë i Vector API ofron funksione për llogaritjet e vektorit që ekzekutohen duke përdorur udhëzime vektoriale në procesorët x86_64 dhe AArch64 dhe lejojnë që operacionet të zbatohen njëkohësisht në vlera të shumta (SIMD). Ndryshe nga aftësitë e ofruara në përpiluesin HotSpot JIT për vektorizimin automatik të operacioneve skalare, API i ri bën të mundur kontrollin e qartë të vektorizimit për përpunimin paralel të të dhënave.
- U shtuan metodat e formatit, printf, readPassword dhe readLine në klasën java.io.Console për të formatuar, shfaqur dhe lexuar tekstin bazuar në vendndodhjen e zgjedhur. System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", data e re()) 2024-mai-16 Jeudi
- Është shtuar një zbatim i dytë paraprak i API-së së zgjeruar të Stream që mbështet përcaktimin e operacioneve tuaja të ndërmjetme, të cilat mund të jenë të dobishme në rastet kur operacionet ekzistuese të ndërmjetme të integruara nuk janë të mjaftueshme për transformimin e dëshiruar të të dhënave. Trajtuesit vendas janë të lidhur duke përdorur operacionin e ri të ndërmjetëm Stream::gather(Gatherer), i cili përpunon elementët e transmetimit duke aplikuar një mbajtës të specifikuar nga përdoruesi për ta. 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]]
- U shtua një zbatim i tretë paraprak i klasave të deklaruara në mënyrë implicite dhe shembujve të paemërtuar të metodës "kryesore", të cilat mund të heqin dorë nga deklaratat publike/statike, duke kaluar një sërë argumentesh dhe entitete të tjera të lidhura me një deklaratë klase. // was public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // tani mund të anuloni main() { System.out.println("Përshëndetje, Botë!"); }
- U shtua një pamje paraprake e dytë e një veçorie që lejon konstruktorët të specifikojnë shprehjet përpara se të thërrasin super(...), e përdorur për të thirrur në mënyrë eksplicite konstruktorin e një klase mëmë nga konstruktori i një klase të trashëguar nëse ato shprehje nuk i referohen një shembulli të krijuar nga konstruktori. class Outer { void hello() { System.out.println("Përshëndetje"); } class Inner { Inner() { hello(); super(); } }
- U shtua një implementim i tretë paraprak i Vlerave të Scoped, duke lejuar që të dhënat e pandryshueshme të ndahen nëpër thread dhe të dhënat të shkëmbehen në mënyrë efikase midis thread-ve fëmijë (vlerat trashëgohen). Vlerat e shtrirjes janë duke u zhvilluar për të zëvendësuar mekanizmin e variablave thread-lokale dhe janë më efikase kur përdoren një numër shumë të madh të temave virtuale (mijëra ose miliona threads). Dallimi kryesor midis vlerave të shtrirjes dhe variablave thread-local është se të parat shkruhen një herë, nuk mund të ndryshohen në të ardhmen dhe mbeten të disponueshme vetëm për kohëzgjatjen e ekzekutimit të thread-it.
- Një vrojtim i tretë i API-së së Strukturuar të Konkurrencës është propozuar për testim, duke thjeshtuar zhvillimin e aplikacioneve me shumë fije duke përpunuar detyra të shumta që ekzekutohen në fije të ndryshme si një bllok i vetëm.
- Metodat e aksesit të memories së jashtme (jashtë JVM) të ofruara nga klasa sun.misc.Unsafe janë zhvlerësuar dhe janë planifikuar për t'u hequr. Për të aksesuar memorien jashtë grumbullit dhe për të ndërvepruar me kodin e jashtëm, rekomandohet përdorimi i API VarHandle dhe API FFM (Funksioni dhe Memoria e Huaj).
Për më tepër, mund të vërejmë publikimin e një përditësimi të platformës për krijimin e aplikacioneve me ndërfaqen grafike JavaFX 23 dhe përfshirjen e përpiluesit GraalVM JIT në Oracle JDK 23 kryesore.
Gjithashtu është paraqitur një version i ri i makinës 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ë cilin mund të gjenerohet bitkodi LLVM (C, C++, Rust). Përveç mbështetjes së JDK 23, versioni i ri optimizon konsumin e kujtesës dhe madhësinë e kodit të ekzekutueshëm dhe ofron mbështetje të plotë për mjetet për futjen e Python dhe WebAssembly në kodin Java duke përdorur përpilimin JIT.
Burimi: opennet.ru

