Pas pas gjashtĂ« muajsh zhvillimi, kompania Oracle lançoi platformĂ«n Java SE 17 (Java Platform, Standard Edition 17), e cila pĂ«rdor projektin e hapur OpenJDK si implementimin referent. PĂ«rveç eliminimit tĂ« disa mundĂ«sive tĂ« vjetra, Java SE 17 ruan pĂ«rputhshmĂ«rinĂ« prapa me versionet e kaluara tĂ« platformĂ«s Java â shumica e projekteve Java tĂ« shkruara mĂ« parĂ« do tĂ« funksionojnĂ« pa ndonjĂ« ndryshim nĂ«n menaxhimin e versionit tĂ« ri. NdĂ«rtimet e gatshme pĂ«r instalim tĂ« Java SE 17 (JDK, JRE dhe Server JRE) janĂ« pĂ«rgatitur pĂ«r Linux (x86_64, AArch64), Windows (x86_64) dhe macOS (x86_64, AArch64). Implementimi referent i Java 17, 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 17 është kategorikuar si një version me mbështetje të zgjatur (LTS), me azhurnime që do të lëshohen deri në vitin 2029. Lëshimi i azhurnimeve për lëshimin e mëparshëm ndërmjet Java 16 është ndaluar. Dega e mëparshme LTS e Java 11 do të mbështetet deri në vitin 2026. Lëshimi i ardhshëm LTS është planifikuar për shtator 2024. Kujtojmë se që nga lëshimi i Java 10, projekti është kaluar në një proces të ri zhvillimi, duke implicuar një cikël më të shkurtër formimi për lëshime të reja. Funksionaliteti i ri tani zhvillohet në një degë master që azhurnohet vazhdimisht, në të cilën përfshihen tashmë ndryshimet e gatshme dhe nga e cila çdo gjashtë muaj degët e stabilizimit për lëshime të reja shkëputen.
Disa nga novacionet e Java 17 përfshijnë:
- Propozohet njĂ« implementim eksperimental i pĂ«rputhjes me modelet nĂ« shprehjet «switch», duke lejuar pĂ«rdorimin e modeleve fleksibile nĂ« etiketat «case» qĂ« kapin njĂ« seri vlerash, pĂ«r tĂ« cilat mĂ« parĂ« nevojiteshin zinxhirĂ« tĂ« mĂ«dhenj shprehjesh «ifâŠelse». PĂ«r mĂ« tepĂ«r, brenda «switch» Ă«shtĂ« siguruar mundĂ«sia pĂ«r tĂ« trajtuar vlerat NULL. Object o = 123L; String formatted = switch (o) { case Integer i -> String.format(«int %d», i); case Long l -> String.format(«long %d», l); case Double d -> String.format(«double %f», d); case String s -> String.format(«String %s», s); default -> o.toString(); };
- Stabilizimi i mbĂ«shtetjes pĂ«r klasat dhe ndĂ«rfaqet e mbyllura («sealed»), tĂ« cilat nuk mund tĂ« pĂ«rdoren nga klasat dhe ndĂ«rfaqet e tjera pĂ«r trashĂ«giminĂ«, gjĂ« qĂ« zgjeron ose pĂ«rsĂ«rit implementimin. Klasat e mbyllura gjithashtu ofrojnĂ« njĂ« mĂ«nyrĂ« mĂ« deklarative pĂ«r tĂ« kufizuar pĂ«rdorimin e superklasĂ«s sesa modifikatorĂ«t e aksesit, tĂ« bazuar nĂ« enumerimin e qartĂ« tĂ« nĂ«nklasave tĂ« lejuara pĂ«r zgjerim. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {âŠ}
- Propozohet një implementim i dytë paraprak i API Vector, që ofron funksione për llogaritjet vektorike, të cilat kryhen duke përdorur komandat vektoriale të procesorëve x86_64 dhe AArch64 dhe lejojnë aplikimin e operacioneve njëkohësisht në disa vlera (SIMD). Ndryshe nga mundësitë e ofruara nga JIT-kompilatori HotSpot për vektorizimin automat të operacioneve skalar, API i ri ofron mundësinë për të kontrolluar qartë vektorizimin për përpunimin paralel të të dhënave.
- Shtimi i një implementimi paraprak të API Foreign Function & Memory, me anë të cilit aplikacionet mund të bashkëpunojnë me kodin dhe të dhënat jashtë Java runtime. API i ri mundëson thirrjen efikase të funksioneve që nuk ekzekutohen në JVM dhe qasjen në kujtesën që nuk menaxhohet nga JVM. Për shembull, mund të thirren funksione nga biblioteka të jashtme të ndara dhe të qasen në të dhënat e procesit pa përdorur JNI.
- Motori i vizatimit pĂ«r macOS, qĂ« siguron funksionimin e API Java 2D, i cili nga ana e tij aktivizohet nĂ« API Swing, Ă«shtĂ« adaptuar pĂ«r pĂ«rdorimin e API grafik Metal. NĂ« mĂ«nyrĂ« default nĂ« platformĂ«n macOS vazhdon tĂ« pĂ«rdoret OpenGL, ndĂ«rsa pĂ«r tĂ« aktivizuar mbĂ«shtetje pĂ«r Metal Ă«shtĂ« e nevojshme tĂ« vendoset bie â-Dsun.java2d.metal=trueâ dhe tĂ« ketĂ« sĂ« paku lĂ«shimin 10.14.x tĂ« macOS.
- Shtimi i një porti për platformën macOS/AArch64 (kompjuterët Apple të bazuar në çipat e rinj Apple M1). Karakteristika e këtij porti është mbështetja për mekanizmin e mbrojtjes së kujtesës W^X (Write XOR Execute), ku faqet e kujtesës nuk mund të jenë njëkohësisht të aksesueshme për të shkruar dhe për të ekzekutuar. (Kodi mund të ekzekutohet vetëm pasi të ndalohet shkrimi, ndërsa shkruhet në një faqe kujtese vetëm pasi të ndalohet ekzekutimi).
- E rikthyer përdorimi vetëm të semantikës strikte (strictfp) për shprehjet me pikë fluturimi. Ndërpritet mbështetje për semantikën e disponueshme duke filluar nga versioni Java 1.2, e cila përfshinte thjeshtime për punën në sisteme me koprosesorë matematikorë mjaft të vjetër x87 (pas shfaqjes së instrukcioneve SSE2, nevoja për semantikë shtesë u zhduk).
- JanĂ« zbatuar lloje tĂ« reja interfacesh pĂ«r gjeneratorĂ«t e numrave tĂ« rastĂ«sishĂ«m, si dhe janĂ« zbatuar algoritme shtesĂ« pĂ«r njĂ« gjenerim mĂ« cilĂ«sor tĂ« numrave tĂ« rastĂ«sishĂ«m. Aplikacionet kanĂ« marrĂ« mundĂ«sinĂ« tĂ« zgjedhin algoritmin e gjenerimit tĂ« numrave tĂ« rastĂ«sishĂ«m. ĂshtĂ« pĂ«rmirĂ«suar mbĂ«shtetje pĂ«r gjenerimin e flukseve tĂ« objekteve tĂ« rastĂ«sishme.
- JanĂ« zbatuar kĂ«rkesa strikte pĂ«r inkapsulimin e tĂ« gjithĂ« elementeve tĂ« brendshĂ«m tĂ« JDK, pĂ«rveç API-ve kritike, siç Ă«shtĂ« sun.misc.Unsafe. Inkapsulimi i rreptĂ« ndalon pĂ«rpjekjet pĂ«r tĂ« aksesuar nga kodi klasat, metodat dhe fushat e brendshme. MĂ« parĂ«, ishte e mundur tĂ« çaktivizohej modaliteti i inkapsulimit tĂ« rreptĂ« duke pĂ«rdorur opsionin ââillegal-access=permitâ, por tani ky opsion Ă«shtĂ« shpallur i vjetruar. Aplikacionet qĂ« kĂ«rkojnĂ« qasje nĂ« klasat, metodat dhe fushat e brendshme duhet ta pĂ«rcaktojnĂ« atĂ« qartĂ« duke pĂ«rdorur opsionin ââadd-opensâ ose atributin Add-Opens nĂ« skedarin e manifestit.
- Aplikacionet janë ngarkuar të përcaktojnë filtra për deserializimin e të dhënave, të cilat mund të varet nga konteksti dhe të zgjidhen dinamikisht në lidhje me operacione të caktuara të deserializimit. Filtrat e vendosur janë të aplikueshëm për të gjithë makinën virtuale (JVM-wide), domethënë mbulojnë jo vetëm aplikacionin vetë, por edhe bibliotekat e palëve të treta të përdorura në aplikacion.
- Në Swing është shtuar metoda javax.swing.filechooser.FileSystemView.getSystemIcon për të shkarkuar ikona me madhësi të madhe, duke lejuar përmirësimin e formimit të ndërfaqes në ekrane me densitet të lartë pikselesh (HighDPI).
- Në API-në java.net.DatagramSocket është implementuar mbështetje për lidhjen me grupet Multicast pa nevojën për të përdorur API të veçantë java.net.MulticastSocket.
- Janë përmirësuar mjetet IGV (Ideal Graph Visualizer), duke siguruar vizualizimin interaktiv të përfaqësimit të përkohshëm të kodit në JIT-kompilatorin HotSpot VM C2.
- Në JavaDoc, për të njëjtin parim si kompileri javac, gjatë shkarkimit të një gabimi tani tregohet numri i linjës problematike në skedarin burimor dhe vendi i gabimit.
- Shtuar pronën native.encoding, e cila pasqyron emrin e kodimit sistemor të karaktereve (UTF-8, koi8-r, cp1251, etj.).
- Shtuar interfaci java.time.InstantSource, i cili lejon manipulimin e kohës pa u lidhur me zonën time.
- Shtuar API java.util.HexFormat për konvertimin në përfaqësimin heksadeshimal dhe anasjellas.
- Në kompiler është shtuar modaliteti blackhole, që çaktivizon operacionet e përjashtimit të kodit të papërdorur (dead-code elimination), i cili mund të përdoret gjatë testeve të performancës.
- NĂ« Runtime Ă«shtĂ« shtuar opsioni â-Xlog:asyncâ pĂ«r regjistrimin e logeve nĂ« modalitetin asinkron.
- Për vendosjen e lidhjeve të sigurta, tani së pari përdoret TLS 1.3 (më parë ishte përdorur TLS 1.2).
- Kategoria e API-t Applet (java.applet.Applet*, javax.swing.JApplet), që ishte shpallur e vjetëruar, është transferuar në kategorinë e atyre që synohen për t'u fshirë, e cila u përdor për të hapur aplikacione Java në shfletues (ka humbur aktualitetin pas ndërprerjes së mbështetjes për plugin-in Java për shfletuesit).
- Menaxheri i Sigurisë është transferuar në kategorinë e atyre që synohen për t'u fshirë, i cili ka humbur relevancën dhe është bërë i pavlerë pas ndërprerjes së mbështetjes për plugin-in e shfletuesit.
- Mekanizmi RMI Activation është hequr, i cili është bërë i vjetëruar, u transferua në kategorinë e opsioneve që nga Java 8 dhe përdoret rrallë në praktikë moderne.
- Nga SDK është hequr kompileri eksperimental, që mbështet JIT (just-in-time) për kompilimin dinamik të kodit Java për HotSpot JVM, si dhe modaliteti i kompilimit parashikues (AOT, ahead-of-time) të klasave në kodin makinerik para fillimit të makinës virtuale. Kompileri është shkruar në Java dhe është bazuar në përpjekjet e projektit Graal. Theksohet se mbështetje e mëtejshme e kompilerit kërkon shumë burime, të cilat nuk justifikohen në kushte të mungesës së kërkesës nga zhvilluesit.
Burimi: opennet.ru
