Pas pas gjashtë muajsh zhvillimi, kompania Oracle publikoi platformën Java SE 16 (Java Platform, Standard Edition 16), për realizimin e së cilës përdoret projekti i hapur OpenJDK. Në Java SE 16 ruhet mbështetje prapambetje për versionet e kaluara të platformës Java, të gjitha projektet e mëparshme të Java do të funksionojnë pa ndryshime 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, të cilat lejojnë lidhje dinamike me produkte komerciale.
Java SE 16 i përket kategorisë së lirimeve me mbështetje standarde, azhurnimet për të cilin do të publikohen deri në lëshimin e ardhshëm. Si një degë me mbështetje të zgjeruar (LTS) rekomandohet Java SE 11, azhurnimet për të cilin do të publikohen deri në vitin 2026. Lirimi i ardhshëm LTS është parashikuar për në shtator 2021. Kujtojmë se që nga lëshimi i Java 10, projekti ka kaluar në një proces të ri zhvillimi, që përfshin një cikël më të shkurtër për formimin e lirimeve 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 prej së cilës ndahen degë për stabilizimin e lëshimeve të reja çdo gjashtë muaj.
Në përgatitjen e lëshimit të ri, zhvillimi është transferuar nga sistemi i menaxhimit të versioneve Mercurial në Git dhe platformën e bashkëpunimit GitHub. Pritet që migrimi të rritë performancën e operacioneve me repositorin, të rrisë efikasitetin e ruajtjes, të sigurojë akses në ndryshimet për të gjithë historinë e projektit, të përmirësojë mbështetje për rishikimin e kodit dhe të angazhojë API për automatizimin e proceseve. Për më tepër, përdorimi i Git dhe GitHub e 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ë theksohet:
- Shtohet moduli eksperimental jdk.incubator.vector me implementimin e API Vector, që ofron funksione për llogaritjet vektoriale, të cilat kryhen duke përdorur instrukcionet vektoriale të pojseve x86_64 dhe AArch64 dhe lejojnë të aplikohen operacione në të njëjtën kohë mbi disa vlera (SIMD). Ndryshe nga mundësitë e ofruara në kompilatorin JIT HotSpot për avtokompozimin e operacioneve skalarë, API i ri lejon menaxhimin e qartë të kompozimit për procesimin paralel të të dhënave.
- Në kodin JDK dhe VM HotSpot, i shkruar në C++, lejohet përdorimi i mundësive që shfaqen në specifikimin C++14. Më parë lejohej përdorimi i standardeve C++98/03.
- Në mbledhësin e mbeturinave ZGC (Z Garbage Collector), i cili punon në mod aktiv dhe përpiqet të minimizojë sa më shumë që të jetë e mundur vonesat nga grumbullimi i mbeturinave, është shtuar mundësia e përpunimit paralel të stekëve të threads pa ndërprerjen e ekzekutimit të threads të aplikacionit. Në ZGC tani kanë mbetur vetëm ato që kërkojnë ndalimin e punës, të cilat kanë vonesa të qëndrueshme, zakonisht që nuk kalojnë disa qindra mikrosekonda.
- Në klasat SocketChannel, ServerSocketChannel dhe java.nio.channels është shtuar mbështetje për soketët Unix (AF_UNIX).
- ĂshtĂ« realizuar njĂ« port pĂ«r distribucionin Linux Alpine me bibliotekĂ«n standarde tĂ« C-sĂ« musl, e cila Ă«shtĂ« e njohur nĂ« mjediset pĂ«r konteinerĂ«, mikroshĂ«rbime, 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 modulĂ«t e papĂ«rdorur dhe tĂ« formohet njĂ« mjedis minimal, i mjaftueshĂ«m pĂ«r ekzekutimin e aplikacionit, qĂ« lejon krijimin e imazheve tĂ« kompaktuara specifike pĂ«r aplikacione tĂ« caktuara.
- Mekanizmi Elastic Metaspace është realizuar, optimizimi i operacioneve të ndarjes dhe kthimit të memories, që zënë metadatën e klasave (metaspace) në JVM HotSpot. Përdorimi i Elastic Metaspace ul fragmentimin e memories, zvogëlon kostot e ngarkuesit të klasave, si dhe ndikon pozitivisht në performancën e aplikacioneve serverike që funksionojnë për një kohë të gjatë përmes kthimit më të shpejtë të memories që zë metadatën e klasave të papërdorura. Për të zgjedhur mënyrën e lirimit të memories pas shkarkimit të klasave, është propozuar opsioni "-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)".
- Shtohet një port JDK për sistemet Windows, që funksionon në pajisje me procesorë të bazuar në arkitekturën AArch64.
- ĂshtĂ« propozuar njĂ« version i tretĂ« parazgjedhor i API Foreign-Memory Access, i cili i lejon aplikacionet Java tĂ« kenĂ« akses nĂ« mĂ«nyrĂ« tĂ« sigurt dhe efektive nĂ« zonat e memories jashtĂ« heap-it tĂ« Java, duke manipuluar me abstraksionet e reja MemorySegment, MemoryAddress dhe MemoryLayout.
- ĂshtĂ« realizuar njĂ« API eksperimentale Foreign Linker, e cila ofron qasje nga Java nĂ« kodin natyror. SĂ« bashku me API-nĂ« Foreign-Memory, ky ndĂ«rfaqe programimi e bĂ«n ndjeshĂ«m mĂ« tĂ« lehtĂ« krijimin e mbĂ«shtetjeve mbi bibliotekat e zakonshme tĂ« ndara.
- ĂshtĂ« shtuar utiliteti jpackage, qĂ« lejon krijimin e paketave pĂ«r aplikacione Java qĂ« janĂ« tĂ« pavarura (self-contained). Ky utilitet bazohet nĂ« javapackager nga JavaFX dhe lejon formimin e paketave nĂ« formate natyrore 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.
- Inkapacelimi i ashpĂ«r i tĂ« gjithĂ« elementeve tĂ« brendshĂ«m tĂ« JDK u stabilizua si standart, pĂ«rveç API-ve kritike, siç Ă«shtĂ« sun.misc.Unsafe. Vlera e opsionit "âillegal-access" tani Ă«shtĂ« caktuar si "deny" nĂ« vend tĂ« "permit", gjĂ« qĂ« do tĂ« rezultojĂ« nĂ« bllokimin e pĂ«rpjekjeve pĂ«r tĂ« aksesuar shumicĂ«n e klasave, metodave dhe fushave tĂ« brendshme nga kodi. PĂ«r tĂ« anashkaluar kĂ«tĂ« kufizim, duhet tĂ« pĂ«rdoret opsioni "âillegal-access=permit".
- Stabilizimi i zbatimit të përputhjes me modelin në operatorin "instanceof" është arritur, i cili lejon të përcaktohet menjëherë një variabël lokale për qasjen në 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ë bëhet pa përcaktimin "Group group = (Group) obj": if (obj instanceof Group group) { var entries = group.getEntries(); }
- Stabilizimi i fjalës kyçe "record" është arritur, duke ofruar një formë kompakte për përcaktimin e klasave, duke lejuar të shmangen përcaktimet e qarta të metodave të ndryshme të nivelit të ulët, siç janë equals(), hashCode() dhe toString(), në raste kur të dhënat ruhten vetëm në fusha, të cilat nuk ndryshojnë. Kur klasa përdor implementimet tipike të metodave equals(), hashCode() dhe toString(), është e mundur të shmangen përcaktimet e 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).
- ĂshtĂ« propozuar njĂ« variant i dytĂ« paraprak i klasave dhe interface-ve tĂ« mbyllura (âsealedâ) qĂ« nuk mund tĂ« pĂ«rdoren nga klasat dhe interface-t e tjera pĂ«r trashĂ«gim, zgjerim ose ri-implementim. 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Ă« 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 {âŠ}
Burimi: opennet.ru
