Pas seis muajsh zhvillimi, kompania Oracle publikoi platformën Java SE 16 (Java Platform, Standard Edition 16), për të cilën përdoret si realizimi referencë projekti i hapur OpenJDK. Në Java SE 16 është ruajtur përputhshmëria me versionet e kaluara të platformës Java, të gjitha projektet Java të shkrura më parë do të funksionojnë pa ndryshime kur ekzekutohen nën menaxhimin e versionit të ri. Ndërtimet e gatshme për instalim të Java SE 16 (JDK, JRE dhe Server JRE) janë përgatitur për Linux (x86_64, AArch64), Windows dhe macOS. Realizimi referencë i Java 16, i zhvilluar në kuadër të projektit OpenJDK, është plotësisht i hapur nën licencën GPLv2 me përjashtime të GNU ClassPath, duke lejuar lidhjen dinamike me produkte komerciale.
Java SE 16 është klasifikuar në kategorinë e lëshimeve me afat të zakonshëm mbështetjeje, për të cilat do të lëshohen përditësime deri në lëshimin e ardhshëm. Si degë me afat të gjatë mbështetjeje (LTS), duhet të përdoret Java SE 11, përditësimet e të cilës do të lëshohen deri në vitin 2026. 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ë nënkupton 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 ndryshimet e gatshme dhe nga e cila degët për stabilizimin e lëshimeve të reja ndahen çdo gjashtë muaj.
Gjatë përgatitjes së lëshimit të ri, zhvillimi është transferuar nga sistemi i menaxhimit të versioneve Mercurial në Git dhe platformën e zhvillimit bashkëpunues GitHub. Pritet që migrimi të rrisë produktivitetin e operacioneve me repositorinë, të rritë efikasitetin e ruajtjes, të sigurojë qasje në ndryshimet gjatë gjithë historisë së projektit, të përmirësojë mbështetje për rishikimin e kodit dhe të angazhojë API për automatizimin e proceseve të punës. Për më tepër, përdorimi i Git dhe GitHub bën projektin më tërheqës për fillestarët dhe zhvilluesit që janë mësuar me Git.
Nga risitë e Java 16 mund të përmenden:
- Moduli eksperimental jdk.incubator.vector është shtuar me implementimin e API Vector, i cili ofron funksione për llogaritjet vektoriale, të cilat realizohen duke përdorur instrukcionet vektoriale të procesorëve x86_64 dhe AArch64, dhe lejojnë aplikimin e operacioneve për disa vlera në të njëjtën kohë (SIMD). Ndryshe nga mundësitë që ofrohen në kompilatorin JIT HotSpot për avokaturën automatike të operacioneve skalarë, API i ri lejon kontrollin e qartë të vektorizimit për përpunimin paralel të të dhënave.
- Në kodin e JDK dhe VM HotSpot, i shkruar në C++, është lejuar përdorimi i mundësive të reja që janë bërë të disponueshme në specifikimin C++14. Më parë ishte e lejueshme përdorimi i standardeve C++98/03.
- Në mbledhësin e mbetjeve ZGC (Z Garbage Collector), që funksionon në modin pasiv dhe redukton sa më shumë të jetë e mundur vonesat për shkak të mbledhjes së mbetjeve, është shtuar mundësia e përpunimit paralel të stekave të rrjedhave pa ndërprerjen e ekzekutimit të rrjedhave të aplikacionit. Tani në ZGC kanë mbetur vetëm ata që kërkojnë ndaljen e operimit, të cilat kanë vonesa të përhershme, zakonisht të pakta, që nuk kalojnë disa qindra mikrosekonda.
- Në klasat SocketChannel, ServerSocketChannel dhe java.nio.channels është shtuar mbështetje për Unix-sockets (AF_UNIX).
- ĂshtĂ« realizuar njĂ« port pĂ«r distribuimin e Linux Alpine me bibliotekĂ«n standarde C musl, e cila Ă«shtĂ« e njohur nĂ« mjediset pĂ«r konteinerĂ«, mikrosisteme, sisteme cloud dhe tĂ« integruara. Porti i propozuar nĂ« kĂ«to mjedise lejon ekzekutimin e programeve nĂ« Java si aplikacione tĂ« zakonshme. PĂ«r mĂ« tepĂ«r, me ndihmĂ«n e jlink, mund tĂ« hiqen tĂ« gjitha modulat qĂ« nuk pĂ«rdoren dhe tĂ« formohet njĂ« mjedis minimal, i mjaftueshĂ«m pĂ«r tĂ« ekzekutuar aplikacionin, i cili mundĂ«son krijimin e imazheve kompakte specifike pĂ«r aplikacione tĂ« caktuara.
- ĂshtĂ« realizuar mekanizmi Elastic Metaspace, qĂ« optimizon operacionet e alokimit dhe kthimit tĂ« memories, e cila merret nga metadatet e klasave (metaspace) nĂ« JVM HotSpot. PĂ«rdorimi i Elastic Metaspace redukton fragmentimin e memories, ul kostot nĂ« ngarkuesin e klasave, gjithashtu ndikon pozitivisht nĂ« performancĂ«n e aplikacioneve serverike qĂ« ekzekutohen pĂ«r njĂ« periudhĂ« tĂ« gjatĂ« pĂ«rmes kthimit mĂ« tĂ« shpejtĂ« tĂ« memories sĂ« operativĂ«s ndaj sistemit, qĂ« merret nga metadatet e klasave qĂ« nuk pĂ«rdoren. PĂ«r tĂ« zgjedhur mĂ«nyrĂ«n e lirimit tĂ« memories pas shkarkimit tĂ« klasave, Ă«shtĂ« propozuar opsioni "-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)".
- Përdorimi i portit JDK është shtuar për sistemet Windows që punojnë me pajisje të bazuara në arkitekturën AArch64.
- Propozohet një variant i tretë i parakohshëm i API-së Foreign-Memory Access, që lejon aplikacionet Java të aksesojnë në mënyrë të sigurt dhe efektive zonat e memories jashtë heaps Java duke manipuluar me abstraksionet e reja MemorySegment, MemoryAddress dhe MemoryLayout.
- APi eksperimental Foreign Linker është realizuar, duke siguruar akses nga Java në kodin natyror. Bashkë me API-në Foreign-Memory, kjo ndërfaqe e re e softuerit ndihmon ndjeshëm në thjeshtimin e krijimit të mbështetjeve mbi bibliotekat e zakonshme të ndara.
- Një utilitet jpackage është shtuar, duke lejuar krijimin e paketave për aplikacione autonome Java. Ky utilitet bazohet në javapackager nga JavaFX dhe lejon formimin e paketave në formate native për platforma të ndryshme (msi dhe exe për Windows, pkg dhe dmg për macOS, deb dhe rpm për Linux). Paketat përfshijnë të gjitha varësitë e nevojshme.
- Inkapcimi i fortĂ« i tĂ« gjithĂ« elementeve tĂ« brendshĂ«m tĂ« JDK Ă«shtĂ« aktivizuar pĂ«r default, pĂ«rveç API-ve kritike, siç janĂ« sun.misc.Unsafe. Vlera e opsionit "âillegal-access" tani Ă«shtĂ« vendosur nĂ« "deny" pĂ«r default nĂ« vend tĂ« "permit", qĂ« do tĂ« çojĂ« nĂ« bllokimin e pĂ«rpjekjeve pĂ«r qasje nĂ« shumicĂ«n e klasave, metodave dhe fushave tĂ« brendshme nga kodi. PĂ«r tĂ« anashkaluar kĂ«tĂ« kufizim, duhen pĂ«rdorur opsionet "âillegal-access=permit".
- Implementimi i stabilizuar i përputhjes me modelin në operatorin "instanceof" tani lejon përcaktimin e menjëhershëm të 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 përcaktuar shprehimisht "String s = (String) obj". Ishte: if (obj instanceof Group) { Group group = (Group) obj; var entries = group.getEntries(); } Tani mund të kalojmë pa përcaktimin "Group group = (Group) obj": if (obj instanceof Group group) { var entries = group.getEntries(); }
- Implementimi i stabilizuar i fjalës kyçe "record" ofron një formë kompakte për të përcaktuar klasat, duke lejuar kalimin pa përcaktimin e shprehur të metodave të ndryshme të nivelit të ulët, siç janë equals(), hashCode() dhe toString(), kur të dhënat ruhen vetëm në fusha, ku sjellja e punës me to nuk ndryshon. Kur në klasë përdoren implementimet tipike të metodave equals(), hashCode() dhe toString(), mund të kalojmë pa përcaktimin e tyre të shprehur: 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).
- Propozohet njĂ« version i dytĂ« paraprak i klasave dhe ndĂ«rfaqeve tĂ« vulosura («sealed»), tĂ« cilat nuk mund tĂ« pĂ«rdoren nga klasat dhe ndĂ«rfaqet e tjera pĂ«r trashĂ«gim, zgjerim ose mbivendosje tĂ« implementimit. Klasat e vulosura gjithashtu ofrojnĂ« njĂ« mĂ«nyrĂ« mĂ« deklarative pĂ«r tĂ« kufizuar pĂ«rdorimin e superklasĂ«s, sesa modifikatorĂ«t e qasjes, duke u bazuar nĂ« njĂ« listĂ« eksplicite 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 {âŠ}
Burimi: opennet.ru
