Lëshimi i platformës Java SE 22 dhe realizimi i hapur referencë OpenJDK 22

Pashe gjashtĂ« muajsh zhvillimi, kompania Oracle lĂ«shoi platformĂ«n Java SE 22 (Java Platform, Standard Edition 22), pĂ«r tĂ« cilĂ«n pĂ«rdoret projekti i hapur OpenJDK si implementimi referues. Me pĂ«rjashtim tĂ« heqjes sĂ« disa funksionaliteteve tĂ« vjetra, Java SE 22 ruan pĂ«rputhshmĂ«rinĂ« prapa me versionet e mĂ«parshme tĂ« platformĂ«s Java — shumica e projekteve Java tĂ« shkruara mĂ« parĂ« do tĂ« funksionojnĂ« pa ndĂ«rrime nĂ«n menaxhimin e versionit tĂ« ri. NdĂ«rkohĂ« janĂ« pĂ«rgatitur ndĂ«rtimet e gatshme pĂ«r tĂ« instaluar Java SE 22 (JDK, JRE dhe Server JRE) pĂ«r Linux (x86_64, AArch64), Windows (x86_64) dhe macOS (x86_64, AArch64). Implementimi referues i Java 22, i zhvilluar si pjesĂ« e projektit OpenJDK, Ă«shtĂ« plotĂ«sisht i hapur nĂ«n licencĂ«n GPLv2 me pĂ«rjashtime GNU ClassPath, tĂ« cilat lejojnĂ« lidhjen dinamike me produkte komerciale.

Java SE 22 i përket kategorisë së lëshimeve me një afat mbështetjeje të zakonshme, për të cilin do të lëshohen përditësime deri në publikimin e versionit të ardhshëm. Si degë me mbështetje të gjatë (LTS) duhet të përdoret Java SE 21 ose Java SE 17, për të cilat do të lëshohen përditësime deri në vitet 2031 dhe 2029 përkatësisht (publiku më i gjerë deri në vitet 2028 dhe 2026). Mbështetja publike për degën LTS të Java SE 11 u ndal në shtator të vitit të kaluar, por mbështetja e zgjeruar do të vazhdojë deri në vitin 2032. Mbështetja e zgjeruar për degën LTS të Java SE 8 do të vazhdojë deri në vitin 2030.

Të kujtojmë se duke filluar nga lëshimi i Java 10, projekti ka kaluar në një proces të ri zhvillimi, që supozon një cikël më të shkurtër formimi të lëshimeve të reja. Funksionaliteti i ri tani zhvillohet në një degë master që përditësohet vazhdimisht, në të cilën përfshihen ndryshime të gatshme dhe nga e cila, çdo gjashtë muaj, krijohen degë për stabilizimin e lëshimeve të reja.

Nga risitë Java 22 mund të përmendim:

  • NĂ« mbledhĂ«sin e plehrave G1 Ă«shtĂ« implementuar mbĂ«shtetje pĂ«r caktimin e pjesĂ«ve (region pinning), e cila lejon pĂ«rkohĂ«sisht tĂ« fiksosh vendndodhjen e objekteve Java nĂ« memorie, pĂ«r tĂ« shmangur zhvendosjen e tyre nga mbledhĂ«si i plehrave dhe pĂ«r tĂ« siguruar njĂ« transferim tĂ« sigurt tĂ« referencave pĂ«r kĂ«to objekte midis Java dhe kodit native. Caktimi ndihmon pĂ«r tĂ« reduktuar vonesat dhe pĂ«r tĂ« shmangur çaktivizimin e mbledhjes sĂ« plehrave gjatĂ« ekzekutimit tĂ« seksioneve kritike (critical regions) JNI (Java Native Interface) me kodin native (gjatĂ« ekzekutimit tĂ« kĂ«tyre seksioneve, JVM nuk duhet tĂ« zhvendosĂ« objektet kritike pĂ«r tĂ« shmangur gjendjet e garĂ«s). Caktimi e pĂ«rjashton objektet kritike nga shikimi i mbledhĂ«sit tĂ« plehrave, i cili mund tĂ« vazhdojĂ« tĂ« kryejĂ« pastrimin e pjesĂ«ve tĂ« pambĂ«shtetura.
  • Eshte shtuar njĂ« funksionalitet i ri paraprak qĂ« lejon specifikimin e shprehjeve nĂ« konstruktorĂ«t para thirrjes sĂ« super(
), e cila pĂ«rdoret pĂ«r tĂ« thirrur qartĂ« konstruktorin e klasĂ«s prind nga konstruktori i klasĂ«s trashĂ«guese, nĂ«se kĂ«to shprehje nuk lidhen me instancĂ«n e krijuar nga konstruktori. class Outer { void hello() { System.out.println(„Hello“); } class Inner { Inner() { hello(); super(); } } }
  • API FFM (Foreign Function & Memory) Ă«shtĂ« stabilizuar, duke lejuar organizimin e bashkĂ«punimit midis programeve Java me kodin dhe tĂ« dhĂ«nat e jashtme pĂ«rmes thirrjes sĂ« funksioneve nga biblioteka tĂ« jashtme dhe qasje nĂ« memori jashtĂ« JVM, pa pĂ«rdorur JNI (Java Native Interface).
  • ËshtĂ« pĂ«rfshirĂ« mbĂ«shtetje pĂ«r variablat e paemĂ«ruar dhe pĂ«rpjekjet e pĂ«rshtatjes me model — nĂ« vend tĂ« variablave tĂ« pavlefshĂ«m, por tĂ« nevojshĂ«m gjatĂ« thirrjes, tani mund tĂ« pĂ«rdorim simbolin „_“. // ishte String pageName = switch (page) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> „ISSUE #“ + issueNumber; 
 }; // tani mund tĂ« pĂ«rdorim String pageName = switch (page) { case GitHubIssuePage(_, _, _, int issueNumber) -> „ISSUE #“ + issueNumber; };
  • NjĂ« implementim paraprak i API Class-File pĂ«r analizimin, gjenerimin dhe transformimin e skedarĂ«ve tĂ« klasave Java Ă«shtĂ« propozuar. 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); } } });
  • NĂ« utilitarin java Ă«shtĂ« implementuar mundĂ«sia pĂ«r tĂ« ekzekutuar programet Java tĂ« shpĂ«rndara nĂ« formĂ«n e disa skedarĂ«ve me kod apo biblioteka tĂ« parapĂ«rcaktuara, pa kompilimin e ndarĂ« tĂ« kĂ«tyre skedave dhe pa konfiguruar sistemin e ndĂ«rtimit. Kjo mundĂ«si e re lehtĂ«son ekzekutimin e programeve, tĂ« cilat kanĂ« kodin e klasave tĂ« ndryshme tĂ« ndara nĂ« skedarĂ« tĂ« veçantĂ«. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println(„Hello!“); } }

    Për shembull, për të ekzekutuar një program që përbëhet nga dy skeduj «Prog.java» dhe «Helper.java» tani mjafton të ekzekutoni «java Prog.java», e cila do të çojë në kompilimin e klasës Prog, do të përcaktojë lidhjen me klasën Helper, do të kërkojë dhe kompilohet skedarin Helper.java dhe do të thërrasë metodën main.

  • ËshtĂ« shtuar njĂ« implementim i dytĂ« i pĂ«rgatitur i shabloneve tĂ« stringĂ«ve (String Template), tĂ« realizuara pĂ«rveç literalĂ«ve tĂ« stringĂ«ve dhe blloqeve tĂ« tekstit. Shabllonet e stringĂ«ve lejojnĂ« kombinimin e tekstit me shprehje tĂ« llogaritura dhe variabla pa pĂ«rdorimin e operatorit «+». ZĂ«vendĂ«simi i shprehjeve realizohet nĂ«pĂ«rmjet zĂ«vendĂ«simeve \{..}, ndersa pĂ«r tĂ« verifikuar saktĂ«sinĂ« e vlerave tĂ« zĂ«vendĂ«suara mund tĂ« lidhen pĂ«rpunues tĂ« veçantĂ«. PĂ«r shembull, pĂ«rpunuesi SQL siguron verifikimin e vlerave tĂ« zĂ«vendĂ«suara nĂ« kodin SQL dhe kthen njĂ« objekt java.sql.Statement, ndĂ«rsa pĂ«rpunuesi JSON ndjek saktĂ«sinĂ« e zĂ«vendĂ«simeve JSON dhe kthen JsonNode. String query = «SELECT * FROM Person p WHERE p.» + property + » = ‘» + value + «‘»; \/\/ ishte Statement query = SQL.»»»SELECT * FROM Person p WHERE p.\{property} = ‘\{value}'»»»; \/\/ tani Ă«shtĂ«
  • ËshtĂ« shtuar njĂ« implementim i shtatĂ« i pĂ«rgatitur i API-sĂ« Vector, e cila ofron funksione pĂ«r llogaritje vektoriale qĂ« kryhen duke pĂ«rdorur instruksionet vektoriale tĂ« procesorĂ«ve x86_64 dhe AArch64 dhe lejojnĂ« aplikimin e operacioneve menjĂ«herĂ« pĂ«r disa vlera (SIMD). Ndryshe nga mundĂ«sitĂ« qĂ« ofrohen nĂ« kompilatorin JIT HotSpot pĂ«r avtokompaktimin e operacioneve skalarĂ«, API i ri ofron mundĂ«sinĂ« e menaxhimit tĂ« qartĂ« tĂ« kompaktimit pĂ«r pĂ«rpunimin paralel tĂ« tĂ« dhĂ«nave.
  • ËshtĂ« shtuar njĂ« implementim i pĂ«rgatitur i zgjeruar i API-sĂ« Stream, i cili mbĂ«shtet definimin e operacioneve tĂ« mesme tĂ« veta, tĂ« cilat mund tĂ« jenĂ« tĂ« dobishme nĂ« raste kur operacionet e integruara tĂ« mesme nuk mjaftojnĂ« pĂ«r transformimin e dĂ«shiruar tĂ« tĂ« dhĂ«nave. PĂ«rpunuesit e vetĂ« lidhĂ«n pĂ«rmes njĂ« operacione tĂ« re mesore Stream::gather(Gatherer), e cila pĂ«rpunon elementĂ«t e stream-it, duke aplikuar mbi ta pĂ«rpunuesin e caktuar 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]]
  • ËshtĂ« propozuar pĂ«r testim njĂ« version i dytĂ« eksperimental i API-sĂ« pĂ«r paralealizmin e strukturuar (Structured Concurrency), qĂ« thjeshton zhvillimin e aplikacioneve me shumĂ« thread-e duke trajtuar disa detyra qĂ« ekzekutohen nĂ« thread-e tĂ« ndryshĂ«m si njĂ« bllok tĂ« vetĂ«m.
  • ËshtĂ« shtuar njĂ« implementim i dytĂ« i pĂ«rgatitur i klasave tĂ« shpallura nĂ« mĂ«nyrĂ« tĂ« tĂ«rthortĂ« dhe instancave pa emĂ«r tĂ« metodĂ«s «main», ku mund tĂ« kalosh pa shpalljen public/static, kalimin e njĂ« array argumentesh dhe entitete tĂ« tjera qĂ« lidhen 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!»); }
  • ËshtĂ« shtuar njĂ« implementim i dytĂ« i pĂ«rgatitur i vlerave tĂ« kufizuara (Scoped Values), qĂ« lejojnĂ« ndarjen e tĂ« dhĂ«nave tĂ« pandryshueshme nĂ« thread-e dhe efektivisht ndajnĂ« tĂ« dhĂ«na midis thread-eve dytĂ«sore (vlerat trashĂ«gohen). Vlerat e kufizuara janĂ« zhvillim pĂ«r tĂ« zĂ«vendĂ«suar mekanizmin e variablave tĂ« ndara tĂ« thread-it (thread-local variables) dhe janĂ« mĂ« efikase kur pĂ«rdoren njĂ« numĂ«r shumĂ« i madh thread-esh (mijĂ«ra dhe miliona thread-e). Dallimi kryesor i Vlerave tĂ« kufizuara nga variablat e ndara tĂ« thread-it Ă«shtĂ« se tĂ« parat regjistrohen njĂ« herĂ«, mĂ« pas nuk mund tĂ« ndryshohen dhe mbeten tĂ« disponueshme vetĂ«m gjatĂ« ekzekutimit tĂ« thread-it.
  • NĂ« mbledhĂ«sin e plehrave Parallel Ă«shtĂ« rritur performanca e punĂ«s me grupe tĂ« mĂ«dha objektesh. Optimizimi ka lejuar nĂ« disa teste me grupe tĂ« mĂ«dha objektesh qĂ« tĂ« ulet vonesa pĂ«rpara fillimit tĂ« kĂ«rkimit tĂ« objektit me 20%.

Përveç kësaj, mund të theksohet publikimi i përditësimit të platformës për krijimin e aplikacioneve me ndërfaqe grafike JavaFX 22.

Burimi: opennet.ru

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster