Java Platform, Standard Edition 9 - Modul do modula – nova Java 9 slagalica
Nakon mnogo iščekivanja, napokon nam je stigla Java 9 – provjerili smo hoće li najnovija verzija najpopularnijeg programskog jezika ispuniti očekivanja
Nakon što se Java 8 pojavila u ožujku sad već davne 2014. godine, najave su govorile da će se sljedeće verzije izdavati svake dvije godine. Na Javi 9 počelo se intenzivno raditi prije tri godine, s najavljenom općom dostupnosti (status General Availability) u rujnu 2016. No, s obzirom na to da se konačan popis značajki zamrznuo tek u svibnju prošle godine te je dodatno proširen u prosincu, terminski plan nekoliko se puta morao prilagođavati, a konačna objava bila je više puta odgođena. 21. rujna ove godine korporacija Oracle je konačno, u skladu s odobrenjem standardizacijskog tijela Java Community Process (JCP), objavila opću dostupnost platforme Java SE 9 i pratećeg Java Development Kita u verziji 9 (JDK9), spremnog za implementaciju u produkcijskim okruženjima.
Prema objavi, najnovija Java donosi više od 150 novih značajki, uključujući novi sustav modularnosti i poboljšanja koja omogućuju još bolje skaliranje, od najmanjih do najvećih uređaja, unaprijeđenu sigurnost i poboljšano upravljanje učinkovitošću te obećava još jednostavniji razvoj developerima, za koje kažu da ih ima čak desetak milijuna. S obzirom na to da je Java najpopularnija razvojna platforma koja se izvodi na čak tri milijarde različitih računala, red je da se pozabavimo najznačajnijim novostima.
Što sve stane pod specifikaciju umbrella?
Kako je novu verziju Jave bilo moguće skinuti i testirati posljednjih godinu dana, zapravo nije bilo velikih iznenađenja, no javna objava važna je jer znači službeni početak podrške i mogućnosti korištenja u produkcijskim okruženjima. Java SE 9 objavljena je pod tzv. “kišobran” specifikacijom JSR 379 (Java Specification Request), koja, uz niz drugih JSR-ova, uključuje čak 55 JEP-ova (JDK Enhancement Proposal) koji označavaju pojedina poboljšanja određenog dijela Jave, a to se sve nalazi unutar projekta OpenJDK. Napomenimo da je Oracle isti dan objavio i novu enterprise verziju platforme Java EE 8 te prateći Software Development Kit (SDK), koje namjerava u obliku otvorenog kôda predati Eclipse Foundationu, kako bi se razvoj platforme Java EE nastavio kolaboracijom cjelokupne Javine zajednice.
Namjera je kroz niz novih specifikacija modernizirati i pojednostaviti korištenje platformi Java SE i Java EE u oblaku i upotrebom mikroservisa. No, kako ovo nije tekst o Javi EE, spomenut ćemo samo da su tu uključene mnoge osvježene specifikacije koje se nadograđuju na Javu SE 9, kao što su, primjerice, Servlet 4.0 s podrškom za HTTP/2, JSON-P 1.1 i JSON-B 1.0, CDI 2.0, JAX-RS 2.1, JSF 2.3 i mnoge druge. Sve to bit će detaljno objašnjeno i na najvećoj svjetskoj Javinoj konferenciji JavaOne, koja počinje 1. listopada u San Franciscu.
Od samih početaka glavni adut i zvijezda nove verzije Jave 9 bila je modularnost, odnosno Java Platform Module System (JPMS), okupljena pod projektom kodnog imena Jigsaw (JSR 376). “Slagalica” je obećavala developerima donijeti prilagodljivo stvaranje kompleksnijih aplikacija tako što mogu uključiti samo one dijelove, module i pakete koji su im zaista potrebni. Očigledno, takva velika promjena morala se izvesti sveobuhvatno, na mnogim bibliotekama razreda, u samom jeziku te u izvedbenom okruženju, donekle usporedivo sa slučajem uvođenja izraza “lambda” u Javi 8. No, to baš i nije bio lagan put te je dovršetak projekta i njegovo uključivanje u novo izdanje Jave označilo nekoliko odgoda, a povijest se proteže kroz razdoblje od čak 9 godina, praktički još od Jave 7. Očekivano, to je izazvalo različite burne reakcije developera, od sumnjičavosti do nevjerice da će modularnost ikad proraditi onako kako je očekivano, no na kraju se većina Javine zajednice složila da se jednostavno mora pričekati da se taj dio posla odradi kvalitetno i rezultat, kakav god bio, uključi u novu verziju. Osim toga, došlo je do niza nedoumica oko budućeg razvoja u Javi 9, primjerice oko upotrebe jače enkapsulacije, kompatibilnosti postojećeg programskog kôda, mogućnosti korištenja alata i biblioteka kao što su Maven, TestNG i Log4J, načina postupne migracije programskog kôda u modularni sustav te podrške za višestruke verzije aplikacija. No, tijekom ljeta većina je stvari razjašnjenja i nova je Java uspješno ugledala svjetlo dana. Najznačajnija novost i dalje je dugo očekivana modularnost koju detaljnije objašnjavamo kasnije, no većini developera trenutačno će mnogo više značiti one “male stvari” koje svakodnevno programiranje čine jednostavnijim.
Pregršt novih značajki
Sve značajke nove Jave nadilaze mogućnosti ovog teksta pa ćemo ukratko opisati samo one najznačajnije. Jedna od takvih je jshell, zgodan način izvršavanja programskog kôda izravno iz naredbenog retka, prema principu REPL (Read-Eval-Print Loop), a koji bi trebao pojednostaviti testiranje dijelova kôda i dati brže rezultate nego klasično prevođenje cijelog kôda. Dodana je podrška za Unicode 7.0 i 8.0, koja omogućuje upotrebu 10555 novih znakova i 29 skripata, a koji uključuju neke povijesne jezike i popularne emojije, te property datoteke u standardu kodiranja UTF-8 (JEP 226) proširenjem ResourceBundle API-ja. Olakšano je i stvaranje kolekcija upotrebom factory metode of(E... elements) s proizvoljnim brojem argumenata, koja se može koristiti nad kolekcijama Set, List i Map. Značajna je i podrška za protokol HTTP/2, koji omogućuje sažimanje zaglavlja, server-push, multipleksiranje višestrukih zahtjeva na jednoj TCP vezi i pregovaranje pomoću ALPN-a, a opet je i dalje kompatibilan s HTTP 1.1.
Unatrag kompatibilno je i poboljšano korištenje memorije kod znakovnih nizova upotrebom novog razreda String, koji prema potrebi za zapis znakova koristi jedan ili više bajtova umjesto fiksnih dvobajtnih znakova (char). Tako se može, ovisno o pojedinom znaku, odabrati različiti encoding znaka i njegova veličina te smanjiti zauzeće memorije, što je korisno prije svega za najčešće znakove standardne abecede i znamenke. Zanimljivost je da će kod starijih aplikacija koje koriste znakovne nizove te razrede StringBuilder i StringBuffer u većoj količini to biti omogućeno već samom instalacijom nove platforme, bez ikakve dodatne prilagodbe. Javina dokumentacija prebačena je na HTML5, i dobila je traku za pretraživanje, a problemima s vidljivošću na modernim zaslonima visoke razlučivosti (HiDPI) doskočilo se automatskim skaliranjem prikaza upotrebom Direct2D API-ja za Windowse i GTK+ za Linux, koji omogućuje i procesiranje slika višestruke razlučivosti na temelju razlučivosti.

Novost je i Stack-Walking API (JEP 259) te razred StackWalker koji omogućuje pretraživanje stoga na standardni način, bez korištenja tuđeg API-ja, upotrebom kratkih ili dugih šetnji stogom uz filtriranje okvira. Novi garbage collector G1 (Garbage-First) optimiran za višeprocesorske poslužitelje s mnogo memorije, dostupan je još od nadogradnje prethodne verzije Jave, a u novoj verziji postao je standard za upravljanje čistoćom memorije. Jedan od naslijeđenih bugova iz Jave 6, razred sun.misc.Unsafe, nakon niza molbi developera iz Javina zajednice nije ukinut, i postao je nova značajka Jave 9 te je njegovo korištenje sada ozakonjeno. Od nešto manjih značajki, tu su, primjerice, i podrška za novu arhitekturu ARM AArch64, novi standard zapisa kriptografskih ključeva PKCS12, podrška za poznati format slika TIFF i osvježeni CompletableFuture. Na kraju ovog odlomka zaključili bismo samo kako je popis novih značajki vrlo dug i zanimljiv, a o nekima možete detaljnije čitati u posebnim okvirima.
Modularnost kao izlaz iz pakla
Glavna ideja iza projekta Jigsaw trebala bi riješiti pomanjkanje stroge enkapsulacije razreda i probleme s JAR-ovima (Java ARchive) poznatije kao “Classpath and JAR Hell”, što bi trebalo biti naročito korisno pri razvoju aplikacija različitih veličina i održavanja biblioteka. Razredi su se oduvijek deklarirali kao javni ili privatni, vidljivi unutar paketa. No, paketi se nisu mogli ugnježđivati te su se stoga razredi većinom deklarirali kao javni. Posljedično, JAR-ovi su zapravo postali skupovi javnih razreda koji ne mogu jednostavno sakriti svoje dijelove te se ne ponašaju kao komponente u skladu s pravilima enkapsulacije.
U novoj verziji moguće je definiranje modula, samoopisnih programskih komponenata koje sadrže jedan ili više paketa, odnosno modularnih JAR-ova. Jasno definiranje koji modul može koristiti druge module i JAR-ove omogućuje istovremenu upotrebu višestrukih verzija istih biblioteka. Sve zajedno to donosi mogućnost boljeg stvaranja softverske arhitekture aplikacija te bolje definiranje slojeva i njihovih sučelja, a prilikom prevođenja lakše se može otkriti i spriječiti narušavanje softverske arhitekture. Osim toga, time su moduli uvedeni i u samu arhitekturu Jave te se više ne mora koristiti cijeli Java Runtime Environment (JRE) kad nije potrebno, primjerice, za manje aplikacije. Samo standardni moduli su implicitno uključeni, a to su modul java.base s paketima java.lang, java.math i java.io, te moduli java.sql, java.desktop i java.xml. Osim toga, uvest će se i datoteke JMOD, svojevrsni JAR-ovi na steroidima, koji mogu uključiti i nativni kôd, konfiguracijske datoteke te ostale prateće podatke. Tako svaka aplikacija može sama definirati što točno treba koristiti, a što izostaviti, smanjujući tako upotrebu memorije i poboljšavajući učinkovitost.
Što nas još čeka u budućnosti?
Nakon nabrajanja tek dijela najznačajnijih novosti, postavlja se pitanje što nije uspjelo stati u ovu verziju Jave te što se može očekivati u Javi 10 ili nekoj sljedećoj. Jedna od glavnih najava su vrijednosni tipovi (value types) kao dio projekta Valhalla. U Javu 9 nisu uspjeli stati ni neki drugi dugoočekivani dijelovi, kao što su novi JSON API te Money and Currency API. No, jedno veliko osvježenje u samom procesu je JEP 11, koji uvodi Incubator Modules, odnosno tzv. inkubatorski API i igralište za još nedovršene dijelove Jave koji će razvijati Java zajednica. Preko njega se već uvodi HTTP/2 Client API, a očekuje se i refaktoriranje jlinka te dijelovi projekta Amber, primjerice, Local Variable Type Inference (JEP 286), Enhanced Enums (JEP 301) i Lambda Leftovers (JEP 302), o čemu ćemo sigurno još pisati. Mark Rheinhold, glavni arhitekt platforme Java u Oracleu, naglasio je da će se u budućnosti primijeniti striktniji vremenski model, s očekivanim objavama novih značajki svakih pola godine i osvježavanjima (update release) svaka tri mjeseca.
Prema prihvaćenom prijedlogu Oraclea, OpenJDK bio bi izdan pod licencijom GPL, što bi dodatno trebalo olakšati postavljanje Java aplikacija u oblak. Ako nakon svega ovoga želite znati i čuti više o Javi, predlažemo da pogledate niz dostupnih videomaterijala o značajkama te posjetite neku od sve većeg broja developerskih konferencija ili meetupa s temama razvoja u Javi. Potencijalno se možete pridružiti i Hrvatskoj udruzi Java korisnika (HUJAK), čiji predstavnici najavljuju i petu developersku konferenciju Javantura u veljači 2018. u Zagrebu te šestu konferenciju JavaCro u svibnju u Rovinju. Na kraju predlažemo da već u ovoj godini isprobate neke od navedenih značajki Jave 9 te da ih što prije počnete ugrađivati u sve buduće, ali i postojeće Java projekte.






NAPOMENA: Ovaj tekst je izvorno objavljen u časopisu Mreža