W rankingach popularności języków programowania Java coraz częściej ustępuje JavaScriptowi, niemniej na ogłoszenie końca epoki jej świetności jest jeszcze zdecydowanie za wcześnie, między innymi za sprawą Androida. Oracle ma jednak z Javą poważny problem – popularność Javy 8. Czy możemy oczekiwać, że udostępniona dziś nowa wersja w jakikolwiek sposób załagodzi ten konflikt interesów?
Java 12 – co nowego?
Zanim odpowiemy na to pytanie, skupmy się na nowościach w Javie. Testowo do Javy 12 trafiły tzw. switch expressions (JEP 325). Pozwalają one wykorzystać instrukcję SWITCH jako wyrażenie, któremu przypisać wartość lub zdecydować, by SWITCH zwracała wartość. Ponadto w przypadku instrukcji SWITCH pojawił się nowy przydatny element składni: ->
. Można po nim wymieniać instrukcje SWITCH CASE w jednej linijce, oddzielając przecinkami, zamiast każdorazowo przerzucać kolejny CASE do nowej linijki.
Na przykład:
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
...
}
można odtąd zapisać jako:
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
...
}
Kolejną zmianą jest opcjonalna dostępność nowego algorytmu odśmiecania pamięci (JEP 189) – mowa o rozwijanym przez Red Hat opensource’owym Shenandoah. Jego ważną cechę stanowi redukcja czasu blokowania aplikacji (pauz) oraz zachowanie tej samej długości pauz niezależnie od wielkości kopca. Shenandoah dostępny jest jako funkcja eksperymentalna w JDK, zaś w OpenJDK nie będzie na razie dostępny w ogóle. Warto przy tej okazji wspomnieć o kolejnej nowości – odtąd garbage collector będzie mógł zwracać pamięć w stałych interwałach (JEP 346), ale tylko wtedy, gdy aplikacja nie jest mocno obciążona.
Zobacz też: Premiera Javy 12 tuż za rogiem, a programiści wciąż wolą pięcioletnią Javę 8
W Javie 12 pojawiły się także mikrobenchmarki (JEP 230) bazujące na znanych z OpenJDK Java Microbenchmark Harness. Z ich pomocą możliwe jest między innymi sprawdzenie liczby i długości iteracji i przeprowadzenie wielu innych testów wydajnościowych. Dodana została także obsługa UNICODE w wersji 12, co oznacza 684 nowe znaki. Oprócz emoji dodano między innymi tzw. copyleft (odbite w poziomie ©), znaki astronomiczne oraz znak do połowy zapełnionej gwiazdki, jaki wykorzystuje się np. w systemach ocen.
W samej maszynie wirtualnej Javy wprowadzono Constants API (JEP 334), które pozwala na modelowanie stałych w puli stałych. Archiwa Class Data Sharing będą odtąd w Javie generowane automatycznie (JEP 341). Kolejna zmiana to usunięcie jednego z dwóch dotychczasowych portów JDK na 64-bitowe procesory ARM (JEP 340), zaś listę nowości zamykają zmiany w algorytmie odśmiecania G1 (JEP 344) – może on dzielić odtąd proces dealokacji na część obowiązkową i wariantywną i zrezygnować z drugiej części, jeśli wymagać będzie tego pauza.
Java 12 – czy przekona do siebie programistów
Jak widać, nie można powiedzieć, że Java 12 wnosi wiele – do czynienia mamy zaledwie z ośmioma zmianami. Z nich tylko jedna jest nowością dotyczącą stricte języka, nie zaś w mniejszym lub większym stopniu maszyny wirtualnej Javy. Możliwość stosowania switch expressions z całą pewnością ułatwi i przyśpieszy codzienną żmudną pracę z instrukcjami warunkowymi. Wątpimy jednak, czy tyle wystarczy, by z tego powodu przenosić całe firmy na Javę 12. Zwłaszcza że nie jest to wydanie LTS.
Oracle nie rozwiązuje zatem swojego największego problemu z rozwojem Javy – niechęci firm i programistów do migracji na nowe wersje. Wciąż lwia część, mając zresztą ku temu wiele słusznych powodów, trwa przy Javie 8, a na Reddicie nie brakuje nawet deklaracji, że przy Javie 7. W osobnym artykule omawialiśmy skutki zmiany cyklu wydawniczego Javy oraz dużych (dla wielu zbyt dużych) zmian, jakie zaszły pomiędzy Javą 8 i Javą 9. Najnowsza Java 12 raczej niczego tu nie zmieni.