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 prapavepruese me versionet e mëparshme të platformës Java, të gjithë projektet Java të shkruara më parë do të funksionojnë pa ndryshime nën menaxhimin e versionit të ri. Ndërtimet e gatshme për instalim të 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 e hapur nën licencën GPLv2 me përjashtime nga GNU ClassPath, të cilat lejojnë lidhjen dinamike me produkte komerciale.
Java SE 15 i taksonizohet si një lëshim me periudhë mbështetjeje të zakonshme, me përditësime që do të lëshohen deri në lëshimin e ardhshëm. Si degë me periudhë të gjatë mbështetjeje (LTS), duhet të përdoret Java SE 11, përditësimet e të cilit do të lëshohen deri në vitin 2026. Dega e mëparshme LTS e Java 8 do të mbështetet deri në dhjetor 2020. Lëshimi i ardhshëm LTS është planifikuar për shtator 2021. Kujtojmë se që nga lëshimi i Java 10, projekti ka kaluar në një proces të ri zhvillimi, që parashikon një cikël më të shkurtër për formimin e lëshimeve të reja. Funksionaliteti i ri tani zhvillohet në një degë master të përhershme të azhurnuar, në të cilën përfshihen ndryshimet e gatshme dhe nga e cila ndahen degët për stabilizimin e lëshimeve të reja çdo gjashtë muaj.
Nga :
- mbështetje për algoritmin e krijimit të nënshkrimit digjital EdDSA (Algoritmi i Nënshkrimit Digjital në Edwards-Curve) ). Implementimi i propozuar i EdDSA nuk varet nga platformat harduerike, është i mbrojtur nga sulmet përmes kanaleve anësore (këtu sigurohet një kohë e vazhdueshme për të gjitha llogaritë) dhe në përformancë e tejkalon implementimin ekzistues të ECDSA, të shkruar në gjuhën C, me të njëjtin nivel mbrojtjeje. Për shembull, EdDSA me përdorimin e harkut eliptik me çelës 126-bit tregon performancë të ngjashme me ECDSA me hark eliptik secp256r1 dhe çelës 128-bit.
- mbështetje eksperimentale për klasat dhe ndërfaqet e vulosura («sealed»), të cilat nuk mund të përdoren nga klasat dhe ndërfaqet e tjera për trashëgim, zgjerim ose tejkalim të implementimit. Klasa të vulosura gjithashtu ofrojnë një mënyrë më deklarative për të kufizuar përdorimin e supershkallës, sesa modifikatorët e qasjes, duke u bazuar në një listim të qartë të nënklasave që lejohet të zgjerohet.
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 fshehura që nuk mund të përdoren drejtpërdrejt nga kodet e tjera të klasave. Qëllimi kryesor i klasave të fshehura është përdorimi në korniza që gjenerojnë dinamikisht klasat gjatë ekzekutimit dhe i përdorin ato në mënyrë indirekte, përmes . Këto klasa zakonisht kanë një cikël jetësor të kufizuar, prandaj mbajtja e tyre për qasje nga klasat e gjeneruara statikisht nuk justifikohet dhe do të çojë vetëm në rritjen e konsumit të memories. Klasat e fshehura gjithashtu lejojnë shmangien e API-së standarde sun.misc.Unsafe::defineAnonymousClass, e cila është planifikuar për t'u hequr në të ardhmen.
- Garuesi i plehrave ZGC (Z Garbage Collector) është stabilizuar dhe është njohur si i gatshëm për përdorim të zakonshëm. ZGC punon në një modalitet pasiv që minimizon sa më shumë vonesat për shkak të grumbullimit të plehrave (koha e ndalimit gjatë përdorimit të ZGC nuk e kalon 10 ms.) dhe mund të funksionojë me grumbuj të vegjël, si dhe me ato shumë të mëdha, nga disa qindra megabajt deri në shumë terabajt.
- Stabilizuar dhe njohur si i gatshëm për përdorim të zakonshëm
garues plehrash , që funksionon me ndalje minimale (Low-Pause-Time Garbage Collector). Shenandoah është zhvilluar nga Red Hat dhe është veçanërisht i njohur për përdorimin e një algoritmi që redukton kohën e ndaljeve gjatë pastrimit të mbeturinave duke e kryer pastrimin paralelisht me ekzekutimin e aplikacioneve Java. Shuma e ndalesave të sjella nga pastruesi i mbeturinave është e parashikueshme dhe nuk varet nga madhësia e heap-it, pra për heap-e prej 200 MB dhe 200 GB ndalesat do të jenë identike ( jashtë 50 ms dhe zakonisht qëndrojnë në 10 ms); - E stabilizuar dhe e futur në gjuhë mbështetje — një formë e re e literalëve të stringjeve, që lejon përfshirjen në kodin burimor të të dhënave tekstuale me shumë rreshta pa përdorimin e karaktereve të ndaluara dhe duke ruajtur formatimin origjinal të tekstit në bllok. Rrethimi i bllokut bëhet me tre thonjëza të dyfishta.
Për shembull, në vend të kodit
String html = "<HTML>" +
"\n\t" + "<BODY>" +
"\n\t\t" + "<H1>\"Java 15 is here!\"</H1>" +
"\n\t" + "</BODY>" +
"\n" + "</HTML>";mund të specifikohet:
String html = """
<HTML>
<BODY>
<H1>"Java 15\
është këtu!"</H1>
</BODY>
</HTML>"""; - API Legjendar DatagramSocket. Implementimet e vjetra të java.net.DatagramSocket dhe java.net.MulticastSocket janë zëvendësuar me një implementim më modern, më të thjeshtë për debuggim dhe mirëmbajtje, si dhe përputhshëm me rrjedhat virtuale që zhvillohen në kuadër të projektit. . Për të parandaluar ndonjë shkelje të mundshme të përputhshmërisë me kodin ekzistues, implementimi i vjetër nuk është eliminuar dhe mund të aktivizohet me opsionin jdk.net.usePlainDatagramSocketImpl.
- Propozohet një realizim i dytë eksperimental në operatorin «instanceof», i cili lejon të përcaktohet menjëherë një variabël lokale për të adresuar vlerën e verifikuar. Për shembull, mund të shkruhet menjëherë «if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}» pa përcaktimin e qartë «String s = (String) obj».
Ishte:
if (obj instanceof Group) {
Group group = (Group) obj;
var entries = group.getEntries();
}Tani mund të anashkaloni përcaktimin «Group group = (Group) obj»:
if (obj instanceof Group group) {
var entries = group.getEntries();
} - realizimi i dytë eksperimental i fjalës kyçe ««, ofron një formë kompakte për të përcaktuar klasat, duke lejuar që të shmangen definicionet e qarta të metodave të ndryshme të nivelit të ulët, si equals(), hashCode() dhe toString(), në raste kur të dhënat ruajnë vetëm në fushat, sjellja e punës me të cilat nuk ndryshon. Kur në klasë përdoren implementime tipike të metodave equals(), hashCode() dhe toString(), mund të shmangen definicionet e tyre të qarta:
public record BankTransaction(LocalDate date,
double amount,
String description) {}Ky shpallje 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).
- një variant të dytë paraprak të API-së Foreign-Memory Access, duke lejuar aplikacionet Java të aksesojnë në mënyrë të sigurt dhe të efektshme fusha memorjeje jashtë grumbullit Java, duke manipuluar me abstraksionet e reja MemorySegment, MemoryAddress dhe MemoryLayout.
- dhe teknika e optimizimit Biased Locking, e cila është shpallur e vjetër dhe u përdor në HotSpot JVM për të reduktuar kostot e mbikëqyrjes për shkak të bllokimeve. Kjo teknikë ka humbur rëndësinë në sistemet me komanda atomike, të ofruara nga CPU-të moderne, dhe është shumë e vështirë për t'u mbajtur për shkak të kompleksitetit të saj.
- mekanizmi i vjetër , i cili do të hiqet në një nga versionet e ardhshme. Vërehet se RMI Activation është shpallur i vjetër, është marrë në rangun e opsioneve që nga Java 8 dhe praktikisht nuk përdoret në praktikën moderne.
- motori JavaScript , i cili është shpallur i vjetër në Java SE 11.
- portet për sistemin operativ Solaris dhe procesorët SPARC (Solaris/SPARC, Solaris/x64 dhe Linux/SPARC). Heqja e këtyre porteve do t'i lejojë komunitetit të përshpejtojë zhvillimin e mundësive të reja OpenJDK, pa humbur kohën në mbështetje të veçorive specifike për Solaris dhe SPARC.
Burimi: opennet.ru
