Pas gjashtë muajsh zhvillimi, kompania Oracle platformën (Java Platform, Standard Edition 14), si përdor si implementimi referencë projekti i hapur OpenJDK. Në Java SE 14 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 në versionin e ri. Këtu janë ndërtimet e gatshme për instalim të Java SE 14 (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 14 i përket kategorisë së versioneve me mbështetje të zakonshme, përditësimet për të do të lëshohen deri në lansimin e ardhshëm. Si degë me mbështetje të zgjatur (LTS) duhet të përdoret Java SE 11, përditësimet për të do të lëshohen deri në vitin 2026. Degë e mëparshme LTS Java 8 do të mbështetet deri në dhjetor 2020. Lansimi i ardhshëm LTS pritet në shtator 2021. Duhet theksuar se që nga versioni Java 10 projekti kaloi në një proces të ri zhvillimi, duke tërhequr cikle më të shkurtra për përgatitjen e versioneve të rinj. Funksionaliteti i ri tani zhvillohet në një degë master që azhurnohet vazhdimisht, në të cilën përfshihen ndryshime të gatshme dhe nga e cila ndahen degë për stabilizimin e lëshimeve të reja çdo gjashtë muaj.
Nga :
- Mbështetje eksperimentale e shtuar 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();
} - Shtuar mbështetje eksperimentale për fjalën e re rezervë ««, 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).
- dhe përfshirë siç duhet mbështetje për formën e re të shprehjeve «switch», që nuk kërkon shpalljen e operatorit «break», duke lejuar grupimin e etiketave të përsëritura dhe duke lejuar përdorimin jo vetëm si operator, por edhe si shprehje.
var log = switch (event) {
case PLAY -> «Përdoruesi aktivizoi butonin e luajtjes»;
case STOP, PAUSE -> «Përdoruesi ka nevojë për një pushim»;
default -> {
String message = event.toString();
LocalDateTime now = LocalDateTime.now();
yield «Ngjarje e panjohur» + message +
» e regjistruar më » + now;
}
}; - Zgjeruar mbështetje eksperimentale — formave të reja të literalit të stringjeve, që lejojnë përfshirjen e të dhënave shumë rreshtore tekstuale në kodin burimor pa nevojën e shkurtimit të simboleve dhe duke ruajtur formësimin origjinal të tekstit në bllok. Kufizimi i bllokut bëhet me tri cita të dyfishta. Në Java 14, blloqet tekstore implementojnë mbështetje për sekrecionin e sekrecioneve «\s» për të përcaktuar një hapësirë të vetme dhe «\» për bashkimin me rreshtin e ardhshëm (injorimi i përfundimit të rreshtit, kur është e nevojshme të nxirret një rresht shumë i gjatë). Për shembull, në vend të kodit
String html = "<HTML>" +
"\n\t" + "<BODY>" +
«\n\t\t» + «\»Java 14 është këtu!\»
» +
"\n\t" + "</BODY>" +
"\n" + "</HTML>";mund të specifikohet:
String html = """
<HTML>
<BODY>»Java 14\
është këtu!"</H1>
</BODY>
</HTML>"""; - Zgjeruar informativitetin e diagnostikës në rastin e paraqitjes së përjashtimeve . Nëse më parë mesazhi i gabimit thjesht referohej numrit të rreshtit, tani ai detajon se cili metodë shkaktoi përjashtimin. Diagnostika e zgjeruar aktualisht aktivizohet vetëm gjatë ekzekutimit me flamurin «-XX:+ShowCodeDetailsInExceptionMessages». Për shembull, nëse ky flamur përdoret, përjashtimi në rreshtin
var name = user.getLocation().getCity().getName();
do të çojë në nxjerrjen e mesazhit
Përjashtim në thread «main» java.lang.NullPointerException: Nuk mund të aktivizohet «Location.getCity()»
sepse vlera e kthyer e «User.getLocation()» është null
në NullPointerExample.main(NullPointerExample.java:5):5)i cili lejon të kuptohet se metoda Location.getCity() nuk u thirr, ndërsa User.getLocation() ktheu një vlerë null.
- prototip i utilitarit jpackage, që lejon krijimin e paketave për aplikacionet Java të pavarura (self-contained). Utilitari 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.
- Në mbledhësin e plehrave G1 një mekanizëm i ri për shpërndarjen e memories, që merr parasysh specifikën e punës në sisteme të mëdha që përdorin arkitekturën . Shpërndarësi i ri i memories aktivizohet me flamurin «+XX:+UseNUMA» dhe lejon të rritet ndjeshëm performanca në sistemet NUMA.
- API për ndjekjen e ngjarjeve JFR (JDK Flight Recorder) në kohë reale, për shembull, për organizimin e monitorimit të vazhdueshëm.
- moduli jdk.nio.mapmode, që ofron mënyra të reja (READ_ONLY_SYNC, WRITE_ONLY_SYNC) për krijimin e buferave të mapuara (MappedByteBuffer), që referohen në memorjen jo-ndihmuese (NVM).
- prototip i API Foreign-Memory Access, që lejon aplikacionet Java të aksesojnë në mënyrë të sigurt dhe efektive territore memorjeje jashtë heap-it Java duke manipuluar abstraktet e reja MemorySegment, MemoryAddress dhe MemoryLayout.
- portet e vjetëruara për OS Solaris dhe procesorët SPARC (Solaris/SPARC, Solaris/x64 dhe Linux/SPARC) me qëllim që të hiqen këto porta në të ardhmen. Kualifikimi i portave të përmendura si të vjetra do t'i lejojë komunitetit të përshpejtojë zhvillimin e mundësive të reja OpenJDK, pa humbur kohë në mbështetje të veçorive specifike për Solaris dhe SPARC.
- mbledhësi i plehrave CMS (Concurrent Mark Sweep), i cili dy vite më parë u shënua se ishte i vjetruar dhe mbeti pa mbështetje (në vend të CMS tani është mbledhësi i plehrave G1). Përveç kësaj, përdorimi i kombeve të algoritmeve të mbledhjes së plehrave ParallelScavenge dhe SerialOld (nisja me opsionet "-XX:+UseParallelGC -XX:-UseParallelOldGC").
- Është siguruar mbështetje eksperimentale për mbledhësin e plehrave ZGC (Z Garbage Collector) në platformat macOS dhe Windows (më parë ishte mbështetur vetëm në Linux). ZGC punon në një mënyrë pasive, sa më shumë që është e mundur minimizon vonesat për shkak të mbledhjes së plehrave (koha e ndalimit gjatë përdorimit të ZGC nuk e tejkalon 10 ms.) dhe mund të punojë si me grumbuj të vegjël ashtu edhe me grumbuj të mëdhenj, duke filluar nga disa qindra megabajt deri në shumë terabajt.
- mjetet dhe API për kompresimin e skedarëve JAR duke përdorur algoritmin Pack200.
Burimi: opennet.ru
