Pas gjashtë muajsh zhvillimi, kompania Oracle platformën (Java Platform, Standard Edition 15), e cila përdor projektin e hapur OpenJDK si implementimin referencë. Në Java SE 15 ruhet përputhshmëria e prapme me versionet e mëparshme të platformës Java, të gjitha projektet Java të shkruara më parë do të funksionojnë pa ndryshime kur ekzekutohen nën menaxhimin e versionit të ri. Ndërtojnë për instalim Java SE 15 (JDK, JRE dhe Server JRE) për Linux (x86_64), Windows dhe macOS. Implementimi referencë 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 15 klasifikohet si një lëshim me periudhë të zakonshme mbështetjeje, përditësimet për të do të lëshohen deri në lëshimin e ardhshëm. Si degë me periudhë të gjatë mbështetje (LTS) duhet të përdoret Java SE 11, përditësimet për të do të lëshohen deri në vitin 2026. Degë e kaluar LTS e Java 8 do të mbështetet deri në dhjetor 2020. Lëshimi i ardhshëm LTS pritet të ndodhë në shtator 2021. Kujtojmë se duke filluar nga lëshimi i Java 10, projekti kaloi në një proces të ri zhvillimi, që parashikon 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 tashmë të gatshme dhe nga e cila për çdo gjashtë muaj ndahen dega për stabilizimin e lëshimeve të reja.
Nga :
- mbështetje për algoritmin e krijimit të nënshkrimit digjital EdDSA (Algoritmi i Nënshkrimit Digjital të Kurvës së Edwards ). Implementimi i propozuar i EdDSA nuk është i varur nga platforma harduese, është i mbrojtur nga sulmet e kanaleve anësore (sigurohet koha e përhershme e të gjitha llogaritjeve) dhe është më efikas se implementimi ekzistues i ECDSA, i shkruar në gjuhën C, me të njëjtin nivel mbrojtjeje. Për shembuj, EdDSA me përdorimin e një kurve eliptike me çelës 126-bit tregon performancën e ngjashme me ECDSA me kurvën eliptike secp256r1 dhe çelësin 128-bit.
- mbështetje eksperimentale për klasat dhe interface-t e mbyllura («sealed») që nuk mund të përdoren nga klasa dhe interface të tjera për trashëgim, zgjerim ose tejkalim të implementimit. Klasat e mbyllura gjithashtu ofrojnë një metodë më deklarative për të kufizuar përdorimin e superklasës, sesa modifikuesit e qasjes, duke u bazuar në listimin 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 {âŠ} - mbĂ«shtetje pĂ«r klasat e fshehta, tĂ« cilat nuk mund tĂ« pĂ«rdoren drejtpĂ«rdrejt nga kodet e tjera tĂ« klasave. QĂ«llimi kryesor i klasave tĂ« fshehta Ă«shtĂ« pĂ«rdorimi i tyre nĂ« kuadĂ«r, qĂ« gjeneron dinamik klasa gjatĂ« ekzekutimit dhe i pĂ«rdor ato nĂ« mĂ«nyrĂ« indirekte, pĂ«rmes KĂ«to klasa zakonisht kanĂ« njĂ« cikĂ«l jetese tĂ« kufizuar, prandaj mbajtja e tyre pĂ«r qasje nga klasat qĂ« janĂ« gjeneruar statikisht nuk Ă«shtĂ« e arsyeshme dhe do tĂ« shkaktonte vetĂ«m rritje tĂ« konsumit tĂ« memories. Klasa tĂ« fshehta gjithashtu lejojnĂ« qĂ« tĂ« anashkalohen API-tĂ« jo standarde sun.misc.Unsafe::defineAnonymousClass, e cila Ă«shtĂ« planifikuar pĂ«r t'u hequr nĂ« tĂ« ardhmen.
- Garbage collector ZGC (Z Garbage Collector) është stabilizuar dhe njohur si i gatshëm për përdorim të gjerë. ZGC punon në mënyrë pasive, duke minimizuar sa më shumë që është e mundur vonesat për shkak të mbledhjes së mbeturinave (koha e ndalimeve gjatë përdorimit të ZGC nuk kalon 10 ms) dhe mund të funksionojë si me grumbuj të vegjël ashtu edhe me grumbuj të mëdhenj, nga disa qindra megabajt deri në shumë terabajt.
- Stabilizuar dhe njohur si i gatshëm për përdorim të gjerë
mbledhĂ«si i mbeturinave , qĂ« funksionon me njĂ« ndalesĂ« minimale (Low-Pause-Time Garbage Collector). Shenandoah Ă«shtĂ« zhvilluar nga Red Hat dhe Ă«shtĂ« i njohur pĂ«r pĂ«rdorimin e njĂ« algoritmi qĂ« redukton kohĂ«n e ndalimeve gjatĂ« mbledhjes sĂ« mbeturinave duke kryer pastrimin paralelisht me ekzekutimin e aplikacioneve Java. MadhĂ«sia e vonesave tĂ« shkaktuara nga mbledhĂ«si i mbeturinave Ă«shtĂ« e parashikueshme dhe nuk varet nga madhĂ«sia e grumbujve, dmth. pĂ«r grumbuj prej 200 MB dhe 200 GB, vonesat do tĂ« jenĂ« tĂ« njĂ«jta ( 50 ms dhe zakonisht mbeten nĂ« 10 ms); - MbĂ«shtetje pĂ«r â formave tĂ« reja tĂ« literalĂ«ve tĂ« vargjeve qĂ« lejojnĂ« pĂ«rfshirjen e tĂ« dhĂ«nave tekstuale mĂ« shumĂ« rreshta nĂ« kodin burimor pa nevojĂ«n pĂ«r shenjat e shĂ«ndoshura dhe duke ruajtur formatimin origjinal tĂ« tekstit nĂ« bllok. Kufizimi i bllokut realizohet me tre thonjĂ«za tĂ« dyfishta.
Për shembull, në vend të kodit
String html = "" +
"\n\t" + "" +
"\n\t\t" + "\"Java 15 është këtu!\"
" +
"\n\t" + "" +
"\n" + "";mund të specifikohet:
String html = """
<HTML>
<BODY>\"Java 15\"
është këtu!"
</BODY>
"""; - API Legacy DatagramSocket. Implementimet e vjetra java.net.DatagramSocket dhe java.net.MulticastSocket janë zëvendësuar me një implementim modern, më të lehtë për debug dhe mirëmbajtje, si dhe të përputhshëm me flukset virtuale që zhvillohen si pjesë e projektit . Në rast të mundshme të shkeljes së përputhshmërisë me kodin ekzistues, implementimi i vjetër nuk është eliminuar dhe mund të aktivizohet përmes opsionit jdk.net.usePlainDatagramSocketImpl.
- Propozohet një implementim eksperimental i dytë në operatorin "instanceof", i cili lejon menjëherë të definihet një variabël lokale për të aksesuar vlerën e kontrolluar. Për shembull, mund të shkruhet menjëherë "if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}" pa nevojën për definimin e qartë "String s = (String) obj."
Ishte:
if (obj instanceof Group) {
Group group = (Group) obj;
var entries = group.getEntries();
}Tani mund të kalojmë pa definimin "Group group = (Group) obj":
if (obj instanceof Group group) {
var entries = group.getEntries();
} - një implementim eksperimental i dytë i fjalës kyçe "", duke ofruar një formë kompakte për të përcaktuar klasat, që lejon kalimin pa definimin e qartë të metodave të ndryshme të nivelit të ulët, si equals(), hashCode() dhe toString(), në rastet kur të dhënat ruhet vetëm në fushat, sjellja e të cilave nuk ndryshon. Kur në klasë përdoren implementimet tipike të metodave equals(), hashCode() dhe toString(), mund të kalojmë pa definimin e tyre të qartë:
public record BankTransaction(LocalDate date,
double amount,
String description) {}Kjo deklaratë do të çojë në shtimin automatik të implementimeve të metodave equals(), hashCode() dhe toString() përveç konstruktorit dhe metodave që kontrollojnë ndryshimin e të dhënave (getter).
- versioni e parë e API Foreign-Memory Access, që lejon aplikacionet Java të kenë një qasje të sigurt dhe efektive në fushat e memories jashtë heap-it Java, duke manipuluar abstraksionet e reja MemorySegment, MemoryAddress dhe MemoryLayout.
- dhe e shpallur obsoletë teknika e optimizimit Biased Locking, e përdorur në HotSpot JVM për të zvogëluar kostot e bllokimeve. Kjo teknikë ka humbur relevancën në sistemet me instruksione atomike, të ofruara nga CPU moderne, dhe është tepër e komplikuar për t'u mbajtur për shkak të kompleksitetit të saj.
- obsolet , e cila do të hiqet në një nga lëshimet e ardhshme. Vërehet se RMI Activation është bërë obsolet, e transferuar në kategorinë e opsioneve që nga Java 8 dhe nuk përdoret gati fare në praktikën moderne.
- motorin JavaScript , i cili u shpall obsolet në Java SE 11.
- portet për OS Solaris dhe procesorët SPARC (Solaris/SPARC, Solaris/x64 dhe Linux/SPARC). Eliminimi i këtyre porteve do t'i lejojë komunitetit të përshpejtojë zhvillimin e mundësive të reja OpenJDK, pa humbur kohë në mbajtjen e veçorive specifike për Solaris dhe SPARC.
Burimi: opennet.ru
