Java Platform, Standard Edition 10 - Proljetna Java 10
Globalno najpopularniji programski jezik i razvojna platforma objavio je novu inačicu samo šest mjeseci nakon prethodne
Točno šest mjeseci nakon izdanja Jave 9 i dan prije službenog početka proljeća, stigla nam je nova Java, odnosno prateći JDK (Java Development Kit) kao referentna implementacija za Java Platform, Standard Edition 10. Testna verzija bila je spremna još u prosincu prošle godine, a verzija Release Candidate objavljena je u veljači, tako da nije bilo kašnjenja službene objave nove Jave 10 u statusu opće dostupnosti (General Availability). Ako ste prošle godine pratili zbivanja vezana uz najavu ubrzanja objava novih izdanja Jave, ovo i nije neko iznenađenje.
Primijetit ćete da je ovo izdanje sadržajno dosta manje od prethodnog te, iako ima dosta novosti, sigurno ih nema ni upola koliko prethodne godine. Da se podsjetimo, na prethodnu verziju Jave 9 čekalo se čak tri godine, a donijela je više od 150 novih značajki, od kojih su najvažnije bile novi sustav modularnosti i mogućnosti skaliranja aplikacija od najmanjih do najvećih, unaprijeđena sigurnost, poboljšano upravljanje učinkovitošću te posljedično jednostavniji razvoj aplikacija najpopularnije razvojne platforme na svijetu, koja se izvodi na čak tri milijarde različitih računala, i na kojoj aplikacije razvija desetak milijuna developera.
Nova Java dvaput godišnje
Kamo im (ili nam) se sad odjednom toliko žuri da trebamo dvije verzije Jave svake godine?! Odgovor na to pitanje možemo pronaći u zahtjevima Java zajednice i desetak tisuća tvrtki koje rade s Javom, među kojima se ističu Oracle, IBM, Amazon, E-bay, Netflix, Red Hat, SAP i slične. Prilikom objave prethodne verzije Jave, glavni arhitekt za Java Platform Group iz Oraclea Mark Reinhold izjavio je da “kako bi Java ostala konkurentna, ne smije samo nastaviti napredovati, već mora napredovati puno brže”.
U tom smislu, prošle godine je objavljeno da će se verzije Jave s novim značajkama (Feature Release) izdavati dvaput godišnje, u ožujku i rujnu svake godine, a osvježavanja (Update Release) čak četiri puta godišnje, u siječnju, travnju, srpnju i listopadu. To je, nakon kašnjenja, ponajviše prouzročenog projektom Jigsaw i novim modularnim sustavom, a i zbog neizvjesne situacije s Javom EE, veći dio Java zajednice dočekala s oduševljenjem. O svim detaljima novih izdanja Jave, novom sustavu označavanja verzija i dostupnosti prateće podrške detaljnije možete pročitati u zasebnom okviru.
Jedna od glavnih novosti u Javi 10 koja bi trebala pojednostavniti posao developerima, je JEP 286 (Local Variable Type Inference), koji donosi automatsko zaključivanje podatkovnih tipova za deklarirane i inicijalizirane lokalne varijable, što smanjuje ceremoniju pisanja tipova u Javi, uz zadržavanje sigurnosti statičkih tipova podataka. Kako se to može koristiti u praksi pogledajte u pripadnom okviru, a napomenimo da se to može uporabiti samo za lokalne varijable i napredne for petlje.
Osim toga, na red su došla i unapređenja sustava garbage collectora (GC). U skladu s JEP-om 304 (Garbage Collector Interface), unaprijeđeni su sučelje i izolacija programskog kôda različitih GC-ova, naročito vezano uz modularnost HotSpota. To bi trebalo pojednostaviti bilo kakve promjene u nekom od postojećih GC-ova (tj. Parallel, CMS, G1…), kao i njihovu zamjenu, ili potencijalno isključivanje te stvaranje novih. Naime, prilikom implementacije novog pretpostavljenog GC-a G1 u Javi 9, primijećeno je da se G1 nije pokazao u najboljem svjetlu kod nekih slučajeva paralelnih obrada. Prema JEP-u 307 (Parallel Full GC for G1), G1 je poboljšan i sada bi trebao podržavati dodatnu kontrolu broja threadova. Osim toga, omogućeno je zaustavljanje pojedinačnih threadova bez stvaranja globalnih sigurnosnih točaka (JEP 213: Thread-Local Handshakes), heap se može pohraniti i na alternativne memorije poput NV-DIMM-ova (JEP 316: Heap Allocation on Alternative Memory Devices), a java.util.Locale podržava dodatne Unicode ekstenzije u skladu s LDML-om (JEP 314: Additional Unicode Language-Tag Extensions).
Tu je prisutno i dosta “održavanja” u obliku podrške za eksperimentalni JIT prevoditelj Graal na Linuxu (JEP 317), novi pretpostavljeni skup krovnih CA certifikata otvorena kôda (JEP 319), preslagivanje repozitorija (JEP 296), izbacivanje alata javah (JEP 313) i još niz drugih “proljetnih čišćenja”, poput izbacivanja deprecated metoda. Nama je zanimljiva i mogućnost da JVM postaje svjestan izvodi li se unutar Dockera te koliko mu je resursa i procesorske snage dodijeljeno, a Docker ima i dodatnu mogućnost ograničenog upravljanja sistemskom memorijom. Malo je ubrzan i REPL alat jShell, a poboljšan je i API za kreiranje nepromjenjivih kolekcija. I to su otprilike sve novosti. Postavlja se pitanje je li sve to dovoljna motivacija za prelazak na novu Javu 10 te postoje li još neke stvari koje bismo trebali znati prije nego što to pokušamo. Prije nego što donesemo zaključak, promotrimo što će biti s prošlim i budućim verzijama Jave te koliko je tu “važna” trenutačno aktualna Java 10.
Verzija izdanja Java SE | Javna objava izdanja | Oznaka (pod)izdanja | Vrsta podrške | Završetak javne podrške | Završetak komercijalne podrške |
7 | srpanj 2011. | 1.7.0_171-b11 | dugoročna (LTS) | - | srpanj 2019. |
8 | ožujak 2014. | 8u161/8u162 1.8.0_161-b12 |
dugoročna (LTS) | siječanj 2019. / prosinac 2020. |
ožujak 2022. |
9 | rujan 2017. | 9.0.4+11 – siječanj 2018. | kratkoročna | ožujak 2018. | ožujak 2018. |
10 | ožujak 2018. | 10 (18.3) 10.0.1 – travanj 2018. 10.0.2 – srpanj 2018. |
kratkoročna | rujan 2018. | rujan 2018. |
11 | rujan 2018. | 11.0.0 (18.9) LTS 11.0.1 – listopad 2018. 11.0.2 – siječanj 2019. |
dugoročna (LTS) | - | rujan 2023. |
12 | ožujak 2019. | 12.0.0 | kratkoročna | - | - |
13 | rujan 2019. | 13.0.0 | kratkoročna | - | - |
14 | ožujak 2020. | 14.0.0 | kratkoročna | - | - |
15 | rujan 2020. | 15.0.0 | kratkoročna | - | - |
16 | ožujak 2021. | 16.0.0 | kratkoročna | - | - |
17 | rujan 2021. | 17.0.0 LTS | dugoročna (LTS) | - | - |
Podrška za Javu 8, 9, 10, 11… ?
Važno je napomenuti da se Java SE 10 (ili kako ju još neki nazivaju 18.3), slično kao i prethodna verzija Java SE 9, smatra tek kratkoročnim izdanjem novih značajki (tzv. non-LTS feature release), a javna osvježavanja bit će aktualna samo šest mjeseci i praktički prestaju izdavanjem sljedeće verzije, kada se korisnicima preporučuje prijelaz na novu verziju. Stoga već u rujnu 2018. očekujemo sljedeću “pravu” verziju Jave SE 11 i pratećeg JDK-a koja donose dugoročnu podršku (Long-Term Support ili LTS).
No, kao što je to dosad bilo i s Javom 7 i 8, takvu verziju možemo očekivati tek svake tri godine. Zbog toga s Oracleovih stranica možete trenutačno skinuti sve tri različite aktualne verzije – Java SE 10, Java SE 9.0.4 i Java SE 8u161/8u162 te prateće JDK-ove. Kraj javnih osvježavanja za još uvijek najrasprostranjeniju Javu 8 očekuje se u siječnju 2019., nekoliko mjeseci nakon što će Java 11 biti izdana. S obzirom na to da migracija s Jave 8 na kasnije verzije nije automatski omogućena preko opcije auto update, developerima se savjetuje da s aplikacijom isporučuju i pripadajuće izvršno okruženje JRE (Java Runtime Environment). Korisnicima koji žele dugotrajnu podršku i održavanje, Oracle, pak, preporučuje prijelaz na komercijalne varijante, odnosno proizvode Oracle Java SE Advanced, Oracle Java SE Advanced Desktop i Oracle Java SE Suite, no to će ih koštati. Očekivano, za komercijalne varijante podrška će biti puno dulja, konkretno za Javu 7 do srpnja 2019., a za Javu 8 do ožujka 2022., a za Javu 9 i 10 preporučuje se prijelaz na buduću verziju 11, koja će imati podršku barem do srpnja 2023.
A što nas čeka u Javi 11?
Iz svega navedenog moglo bi se zaključiti da ako ste još uvijek na Javi 8 te niste migrirali na Javu 9, onda možda ima smisla pričekati još pola godine i dočekati Javu 11, koja će donijeti dugoročnu podršku. Osim toga, kao i dosad, mnoge stvari nisu stigle ući u izdanje Java 10 te se stoga očekuju u verziji 11 ili nekoj narednoj. Primjerice, projekt Valhalla postavljen je kao inkubatorsko igralište za nedovršene dijelove Jave koje Java zajednica tek razvija, primjerice, vrijednosne tipove nepromjenjivih i nereferentnih objekata (JEP 169: Value Objects) za podršku učinkovitijem korištenju neprimitivnih tipova, ili proširenje generičkih tipova kako bi podržavali specijalizaciju generičkih klasa i sučelja nad primitivnim tipovima (JEP 218: Generics over Primitive Types), kao što je, primjerice, List<int>.
Tu je i drugi inkubatorski projekt Amber, koji sadrži prijedloge za Enhanced Enums (JEP 301), Lambda Leftovers (JEP 302), Pattern Matching (JEP 305), Local-Variable Syntax for Lambda Parameters (JEP 323), Switch Expressions (JEP 325) i Raw String Literals (JEP 326). Projekt Panama trebao bi bolje povezati JVM s nativnim kôdom pisanim u jezicima poput C-a i C++-a, pomoću poziva nativnih funkcija i korištenjem nativnog pristupa podacima izravno iz JVM-a. Projekt Loom trebao bi smanjiti kompleksnost pisanja aplikacija alternativnom izvedbom implementacije threadova pomoću schedulera i manipulacijom stoga poziva metoda. A za JDK 11 najavljeni su i novi HTTP/2 Client (JEP 321), konstante dinamičkih klasa (JEP 309), novi garbage collector Epsilon (JEP 318), korištenje varova u lambda izrazima (JEP 323) te čišćenje starih Java EE i CORBA modula (JEP 320), kao i prebacivanje Java FX-a u vlastiti modul.
Podsjetimo se kako se prošle godine dogodio i prijelaz Java EE u novi projekt otvorena kôda, nazvan Jakarta EE, koji sada vodi Eclipse Foundation. Ako želite saznati više, predlažemo da posjetite barem neke od developerskih konferencija i meetupa s temama razvoja u Javi, od kojih su neke i u Hrvatskoj. Na kraju, ako već radite s Javom 9, onda je nova “desetka” očekivana nadogradnja. Ako tek razmišljate o prijelazu s Jave 8 i potencijalno imate vremena pričekati jesensku Javu 11, možda bi ipak bilo bolje da pokušate vidjeti novitete iz Jave 10 što prije, jer bi “kvantni skok” s verzije 8 na 11 mogao biti prilično velik zalogaj.
Tipovi naši svagdašnji
Jedna od najznačajnijih novosti u novoj Javi 10 je prošireno zaključivanje podatkovnih tipova za deklaraciju inicijaliziranih lokalnih varijabli u skladu s JEP-om 286 (Local Variable Type Inference), koje zadržava sigurnost statičkih tipova podataka (static type safety). U praksi to znači da možete smanjiti redundanciju programskog kôda i umjesto tipa jednostavno napisati ključnu riječ var.
var ivan = new User();
var list = new ArrayList<String>(); // list je tipa ArrayList<String>
var stream = list.stream(); // stream je tipa Stream<String>
Kada prevodilac primijeti rezervirani naziv tipa var, on će sam zaključiti kojeg tipa treba biti određena varijabla. U ovom slučaju ivan će postati tipa User, list će biti ArrayList<String>, a stream će biti Stream<String>. To bi navodno trebalo pojednostavniti posao developerima, jer više neće trebati pisati tipove podataka za lokalne varijable s inicijalizacijom, kao ni za indekse i lokalne varijable u naprednim petljama. Dakle, moguće je izvesti naprednu for petlju bez navođenja eksplicitnog tipa, primjerice
for (var user : users) System.out.println(user.toString())
No, moramo biti svjesni činjenice da ovo nije podrška dinamičkim tipovima podataka te kako to nije moguće koristiti za parametre metoda, uključivo i konstruktora, povratne vrijednosti metoda, polja ili bilo koje druge deklaracije varijabli, kao ni za lokalne varijable koje se naknadno inicijaliziraju ili pri hvatanju iznimaka. Prednost ovakvog načina zapisa jest to što je nešto sličniji lambda izrazima te jezicima Scala i Kotlin. No, postoje i kritike koje propituju koliko je takav kôd pregledan te zašto nisu podržane i konačne lokalne varijable uporabom ključne riječi val. Osim toga, većina modernih razvojnih okruženja nudi automatsko dopunjavanje (autocomplete) i refaktoriranje tipova, pa je upitno koliko će ovo zapravo biti korisno u praksi.
Popis svih 12 JEP-ova (JDK Enhancement Proposal) u Javi 10
286: Local-Variable Type Inference
296: Consolidate the JDK Forest into a Single Repository
304: Garbage-Collector Interface
307: Parallel Full GC for G1
310: Application Class-Data Sharing
312: Thread-Local Handshakes
313: Remove the Native-Header Generation Tool (javah)
314: Additional Unicode Language-Tag Extensions
316: Heap Allocation on Alternative Memory Devices
317: Experimental Java-Based JIT Compiler
319: Root Certificates
322: Time-Based Release Versioning
NAPOMENA: Ovaj tekst je izvorno objavljen u časopisu Mreža.