Lansirana je verzija dugoročne podrške (LTS) za programski jezik Java i njenu platformu za izvršavanje, Java 17, dana 14. septembra 2021. godine. Pogledajmo koje su novine u Javi 17 i da li je preporučljivo izvršiti nadogradnju.
Mnoge aplikacije koriste starije verzije Jave, uključujući i starije LTS verzije kao što su Java 11 i Java 8.
Zašto bi kompanije trebalo da pređu na najnoviju verziju Jave? Nadogradnja na Javu 17 zahteva određeni trud, prvenstveno kako bi se iskoristile sve prednosti novih karakteristika i funkcionalnosti unutar JVM-a.
Mnoge kompanije koriste Docker i Docker slike kako bi olakšale prelazak na Javu 17 uz minimalan napor i utrošeno vreme. Programeri mogu definisati svoje kanale za kontinuiranu integraciju/isporuku (CI/CD) i pokrenuti sve unutar Docker slika. Ovo neće uticati na druge timove koji koriste starije verzije Jave, jer oni mogu nastaviti koristiti stare Docker slike.
JAVA 17 KARAKTERISTIKE
Podrška za macOS i AArch64
Jedna od ključnih JVM funkcionalnosti dodatih u ovoj verziji je poboljšana podrška za macOS na AArch64 arhitekturi, implementirana putem JEP 391. Ova podrška obuhvata i najnoviju seriju procesora (M1) koje je Apple predstavio sa svojim računarima tokom protekle godine.
Ovo možda nije od presudnog značaja za korisnike ovih platformi, budući da su određeni dobavljači već lansirali verzije JDK-a koje podržavaju ovu arhitekturu, uključujući i povratnu podršku za Javu 8. Međutim, zvanična potvrda je ključna za osiguravanje budućeg održavanja i podrške platforme. Poređenja radi, podrška za Linux/AArch64 platformu je uvedena u Javi 9, a za Windows/AArch64 u Javi 16.
Zapečaćene klase
Zapečaćene klase su nova karakteristika koja je uvedena u Javi 17. Ova funkcionalnost je završila fazu testiranja i postala zvanična platforma i jezička karakteristika Jave 17. Omogućava programerima da definišu dozvoljene podtipove koje određeni tip može imati i da spreče druge da ga proširuju ili implementiraju na način koji nije predviđen.
Zapečaćene klase takođe omogućavaju kompajleru da generiše greške tokom kompilacije ukoliko se pokuša konverzija nezapečaćenog tipa u nedozvoljeni podtip. Java 17 takođe donosi novi mehanizam za renderovanje za AWT/Swing aplikacije koje se izvršavaju na macOS-u, koristeći Apple Metal API umesto OpenGL-a. Takođe, ima poboljšan API i funkcionalnosti za generisanje slučajnih brojeva.
Promene, uklanjanja i ograničenja u Javi 17
Java 17 takođe donosi nekoliko promena, uklanjanja i novih ograničenja.
Enkapsulacija JDK internih delova
Jedna od promena je završetak procesa enkapsulacije JDK Internals. Ova funkcionalnost je prvi put uvedena u Javi 9 i generisala je upozorenja tokom izvršavanja ukoliko bi korisnik pokušao da koristi refleksiju ili slične mehanizme kako bi zaobišao standardna ograničenja za korišćenje internih API-ja. Dodati su i argumenti komandne linije radi regulisanja ovakvog ponašanja.
Od Jave 9, kreirani su različiti API-ji koji nude jedinstven način za izvršavanje najčešće korišćenih zadataka; korisnici bi interno koristili ove API-je. Sa Javom 16, podrazumevana vrednost je promenjena sa upozorenja na onemogućavanje pristupa i izbacivanje izuzetka. Međutim, korišćenjem argumenta komandne linije, ovo ponašanje je moglo biti izmenjeno.
Sa Javom 17, argument komandne linije je eliminisan i onemogućavanje ovog ograničenja više nije moguće. To znači da je svaki neovlašćeni pristup internim API-jima sada zaštićen.
Uvek striktna semantika sa pokretnim zarezom
Dodatno „uklanjanje“ se može opisati kao ponovno uvođenje semantike koja uvek koristi striktne brojeve sa pokretnim zarezom. Java 1.2 je uvela modifikacije podrazumevane semantike brojeva sa pokretnim zarezom u Javi, koje su omogućavale JVM-u da trguje sa malom preciznošću u proračunima sa pokretnim zarezom kako bi se poboljšale performanse. U klasama i metodama gde je morala da se koristi striktna semantika, dodata je ključna reč strictfp. Od tada, različiti tipovi setova instrukcija su uvedeni u procesore, omogućavajući da se striktna semantika sa pokretnim zarezom koristi bez dodatnih troškova. Potreba za implementacijom podrazumevane ili striktne semantike je eliminisana.
Java 17 uklanja prethodnu podrazumevanu semantiku, i sve operacije sa pokretnim zarezom se izvršavaju striktno. Termin strictfp i dalje postoji, ali nema nikakav efekat i generiše upozorenje tokom kompajliranja.
Kompilacija unapred (AOT)
Java 9 je uvela kompilaciju unapred (AOT) kao eksperimentalnu funkciju koja koristi Graal kompajler, gde je JIT kod napisan koristeći Javu. Java 10 je omogućila da Graal kompajler bude upotrebljiv kao JIT kompajler u OpenJDK-u uključivanjem JVMCI interfejsa. Od tada je došlo do značajnih poboljšanja. Graal kompajler je postigao veliki napredak i ima sopstvenu JVM pod imenom GraalVM.
RMI aktivacija
RMI aktivacija je eliminisana u JEP 407 nakon njenog uklanjanja iz Jave 8 i konačnog označavanja kao uslova za uklanjanje unutar Jave 15. RMI Activation je obezbeđivao metod za omogućavanje resursa distribuiranih objekata na zahtev koristeći RMI. Međutim, imala je minimalnu upotrebu, a danas postoje bolje alternative. Ostatak RMI nije pogođen eliminacijom dela za aktivaciju.
Uklanjanje API-ja apleta
API za aplete je konačno označen za uklanjanje od strane JEP 398, nakon što je prvobitno uklonjen u Javi 9. API za aplete je obezbeđivao način za integrisanje Java AWT/Swing kontrola u veb stranice unutar pretraživača. Međutim, nijedan savremeni pretraživač to više ne podržava, što znači da apleti praktično nisu bili dostupni tokom poslednje decenije.
Menadžer bezbednosti
Najvažnije odricanje od starih funkcionalnosti je eliminisanje menadžera bezbednosti (JEP 411). Security Manager je u upotrebi još od Jave 1.0. Dizajniran je da ograniči šta Java može da radi lokalno na mašini, kao što je ograničavanje pristupa mrežama, datotekama i drugim mrežnim resursima. Takođe, pokušava da zaštiti kod u zaštićenom okruženju koji nije pouzdan, blokiranjem refleksije i specifičnih API-ja.
Kraj Security Manager-a je počeo u Javi 12. Argument komandne linije je dodat kako bi se blokiralo korišćenje menadžera bezbednosti tokom izvršavanja. Promena napravljena u Javi 17 znači da će se upozorenje generisati u JVM-u tokom izvršavanja ukoliko se pokuša podešavanje Security Manager-a, bilo iz komandne linije ili dinamički tokom izvršavanja.
Funkcije inkubatora i pregleda
Mnogi su se pitali da li će Java 17 imati funkcije za pregled i inkubator, s obzirom na to da je Java 17 promovisana kao verzija sa dugoročnom podrškom. Java 17 ima dva modula inkubatora i jednu funkciju za pregled!
Vector API
Vector API (JEP 414) je trenutno u drugoj fazi inkubatora. Ovaj API omogućava programerima da definišu vektorsko izračunavanje, koje će JIT kompajler zatim konvertovati u odgovarajuću vektorsku instrukciju koju podržava CPU arhitektura na kojoj JVM radi (npr., koristeći one iz skupova instrukcija SSE ili AVX).
Ranije su programeri morali da koriste skalarne funkcije ili da kreiraju izvorne biblioteke koje su bile specifične za platformu. Implementacija Vector API-ja u Javi takođe obezbeđuje besprekoran rezervni mehanizam koji je bio komplikovan u ranijim verzijama.
Standardizacija Vector API-ja omogućava klasama unutar JDK-a da ga koriste. Metode Java Arrays mismatch() se mogu modifikovati tako da se pokreću na Javi umesto na drugim platformama, čime se eliminiše potreba za održavanjem i pisanjem više platformsko-specifičnih implementacija unutar JVM-a.
Strane funkcije i API za memoriju
Dodatna funkcija inkubatora se naziva Foreign Function & Memory API (JEP 412). Ovo je evolucija i spajanje dva druga modula inkubatora iz Jave 16, Foreign Linker API (JEP 389) i API za spoljnu memoriju (JEP 393). Oba obezbeđuju pristup izvornoj memoriji i kodu koristeći statički tipizirano programiranje napisano u Javi.
Pattern Matching for Switch
Poslednja karakteristika jezika u pregledu, uključena u Javu 17, je Pattern Matching for Switch (JEP 406). Ova jezička funkcija proširuje izraze i naredbe switch u odnosu na tip, slično sintaksi koja se koristi kroz Pattern Matching (JEP 394), koji je postao standard sa Javom 16.
U prošlosti, ako ste želeli da izvršite različite radnje na osnovu dinamičke prirode objekta, morali ste da konstruišete if-else lanac koristeći instanceof provere, kao na primer:
String type(Object o) { if (o instanceof List) { return "A List of things."; } else if (o instanceof Map) { return "A Map! It has keys and values."; } else if (o instanceof String) { return "This is a string."; } else { return "This is something else."; } }
Kombinovanjem izraza switch i nove funkcije za podudaranje šablona za switch, proces se može pojednostaviti na sledeći način:
String type(Object o) { return switch (o) { case List l -> "A List of things."; case Map m -> "A Map! It has keys and values."; case String s -> "This is a string."; default -> "This is something else."; }; }
Kao što ste možda primetili, postoji deklaracija promenljive tokom procesa provere. Slično drugim varijablama u Pattern-u, poklapanje instance ukazuje na to da je tip ovog objekta proveren i da je dostupan iz varijable u svom trenutnom opsegu.
Ova funkcija pregleda je još jedan korak ka potpunom podudaranju šablona. Sledeći korak je uključivanje mogućnosti dekonstrukcije nizova i zapisa.
Da li treba da nadogradite na Javu 17?
Da, neophodno je kontinuirano nadograđivati na najnoviju verziju, ali ne odmah po njenom objavljivanju. Softver i biblioteke koje koristite možda neće biti ažurirani da bi bili kompatibilni sa Javom 17, tako da ćete možda morati da sačekate neko vreme dok se to ne završi.
Ako koristite LTS verziju Jave kao što je Java 8 ili Java 11, postoji mnogo novih funkcija u jeziku i samom JVM-u koje opravdavaju nadogradnju na Javu 17. Pošto je ovo izdanje sa dugoročnom podrškom, velika je verovatnoća da će i vaše proizvodno okruženje na kraju biti nadograđeno na Javu 17.
Ako pokrećete potpuno novi projekat ili pripremate vaš postojeći projekat za Javu 17, prelazak na Javu 17 što pre je verovatno najefikasniji izbor, jer smanjuje troškove migracije. Takođe omogućava programerima koji rade na projektu da iskoriste sve najnovije funkcije i operativnu stranu.
Možete iskoristiti mnoga poboljšanja koja su se dogodila tokom proteklih nekoliko godina, kao što je poboljšana podrška za kontejnere koji rade na Javi, kao i nove implementacije sakupljača smeća sa malim kašnjenjem.