Java 18 – co nowego?

bartlomiejchmielewski.pl 2 lat temu

Java 18 wychodzi już za parę dni. A konkretnie 22 marca. Finalnie zobaczymy w niej dziewięć nowych funkcji. A co dokładnie nowego znajdziemy w tej edycji. O tym wszystkim dowiesz się tutaj.

Java 18

Dziewięć nowych funkcji w trzech obszarach. Powiedziałbym, iż w ostatnich latach Java nas nie rozpieszczała przy kolejnych wydaniach. Ale to wydanie wydaje się wyjątkowo małe. W każdym razie od Java 12 i 13 (osiem zmian w 2018 i pięć w 2019) jest to najmniejsza paczka pod względem liczby proponowanych zmian. Dotyczą one obszarów:

  • Core Java Library (7 zmian),
  • Java Tools (1 zmiana),
  • Java Specification (1 zmiana).

A oto lista:

ObszarJDK Enhancement Proposal (JEP)
Core Java Library400: UTF-8 by Default
408: Simple Web Server
416: Reimplement Core Reflection with Method Handles
417: Vector API (Third Incubator)
418: Internet-Address Resolution SPI
419: Foreign Function & Memory API (Second Incubator)
421: Deprecate Finalization for Removal
Java Tools413: Code Snippets in Java API Documentation
Java Specification420: Pattern Matching for switch (Second Preview)

Core Java Library

Wg mnie bardzo fajną zmianą, choć niekoniecznie specjalnie medialną, jest 400: UTF-8 by Default. Przede wszystkim załatwi to w dużej mierze sprawę uruchamiania aplikacji z domyślnym charsetem.

Dla przypomnienia, do tej pory jeżeli charset nie był przekazywany w parametrze, to Java wybierała domyślny na podstawie runtime. Czyli pod uwagę brana była instalacja Javy w systemie operacyjnym, ustawienia użytkownika i tym podobne rzeczy.

W efekcie mogło się zdarzyć, o czym każdy doświadczony developer wie, iż nasza aplikacja mogła nie zachowywać się najlepiej. Teraz przynajmniej ten problem zostanie trochę rozwiązany.

Idźmy dalej. Prosty web server, czyli 408: Simple Web Server. W zeszłym tygodniu zastanawiałem się, czy takie rozwiązanie ma sens. Bo w zasadzie jest takich mini serwerów mnóstwo. Ale doszedłem do wniosku, iż umieszczenie tego w Javie ma zdecydowanie kilka plusów.

Przede wszystkim, gdy programujesz od kilku lat, to wiesz, iż taki serwer to nie problem. Uruchamiasz na przykład coś z npm. I już.

Ale… gdy zaczynasz programować… No właśnie, gdy zaczynasz programować, to wszelkie rzeczy są pomocne. I wówczas zwykle nie wiesz, co to jest web serwer i jak go ściągnąć, uruchomić, itp.

Dlatego uważam, iż umieszczenie tego rozwiązania w Javie to dobry pomysł, który ułatwi początkującym naukę.

Poprawki w wewnętrznej implementacji API refleksji dostarczone będą poprzez 416: Reimplement Core Reflection with Method Handles. Wewnętrzne, czyli z naszego punktu widzenia nic się nie zmieni. JEP wspomina, iż w niektórych scenariuszach benchmarkowych wydajnościowych nowa implementacja wypada gorzej o 51-77%. Jednak to benchmarki i biorą pod uwagę specyficzne zachowania. W typowym oprogramowaniu nie powinniśmy zauważać większych różnic.

Przełożeniem instrukcji wektorowych na realizację zadania na CPU to 417: Vector API (Third Incubator). Tu cały czas walka toczy się o optymalne rozwiązanie.

418: Internet-Address Resolution SPI to zmiana z projektu Loom. Dzięki niej mamy zyskać możliwość rozwiązywania nazw hostów na IP bez wykorzystania DNS i plików hosts z systemu operacyjnego. jeżeli chodzi o Loom, to pamiętamy, iż dotyczy on wątków wirtualnych. Dlatego możliwość zamiany blokującego pytania systemu operacyjnego na coś nieblokującego jest tutaj mocno wskazana.

Powoli do przodu idą też prace związane z wywoływaniem obcych funkcji i dostępem do pamięci spoza JVM. Drugi raz w inkubatorze widzimy to w postaci 419: Foreign Function & Memory API (Second Incubator). Trudny obszar.

Zapowiedź pożegnania z finalize() (np. java.lang.Object.finalize()) mamy w 421: Deprecate Finalization for Removal. Na razie jest to tylko oznaczenie, ale widać, iż w końcu Java pozbędzie się tego błędogennego mechanizmu.

Java Tools

413: Code Snippets in Java API Documentation to niby nic wielkiego. Bo wprowadzono tag @snippet do dokumentacji. Będziemy mieli troszkę ładniej sformatowane przykłady. Mały rzecz, a oko mam nadzieję będzie cieszyć.

Jeśli chodzi o zastosowanie, to mam wątpliwość. Głównie chodzi o kod biznesowy, w którym generalnie i tak zwykle za dużo przykładów się nie pojawia.

Z kolei w różnych bibliotekach myślę, iż to się przyda. I autorzy będą mieli trochę łatwiej przy dokumentowaniu swoich rozwiązań.

Java Specification

W tym wydaniu dostajemy też kontynuację w ramach projektu Amber. 420: Pattern Matching for switch (Second Preview). to coraz dłużej wyczekiwany pattern matching w instrukcji switch. Przykład z JEP:

static String formatterPatternSwitch(Object o) { return switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> o.toString(); }; }

Ostatnio pisałem, o tym, iż osoby ze świata Scali mogą się tu trochę pośmiać. Bo dla Scali tego typu konstrukcje są normalne Ale w Javie to cały czas nowość. Szkoda tylko, iż żeby przyjęło się to w kodzie w oprogramowaniu korporacyjnym to będziemy czekać do kolejnego wydania LTS.

Java 18 – podsumowanie

No i fajnie. Java 18 zaraz będzie dostępna. To wydanie moim zdaniem nie jest jakimś dużym krokiem naprzód. Zawiera kilka zmian, które cały czas przygotowują Javę do większych modyfikacji w niedalekiej przyszłości.

Dla mnie najciekaszy pozostaje temat 420: Pattern Matching for switch (Second Preview).

A dla Ciebie? Która ze zmian jest wg Ciebie ciekawa?

O kolejnych wydaniach Javy możesz przeczytać w artykułach:

  • Java 18 – co nowego?
  • Java 17 – co nowego?
  • Java 16 Przegląd Nowości
  • Java 15 – co nowego w JDK? oraz Java 15 General Availability
  • Java 14 – co nowego?

Idź do oryginalnego materiału