Kategorie
java

Java 18 – co nowego?

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.

junior-hava-developer-handbook-what-to-know

Java 18

Dziewięć nowych funkcji w trzech obszarach. Powiedziałbym, że 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śli 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, że 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, że umieszczenie tego w Javie ma zdecydowanie kilka plusów.

Przede wszystkim, gdy programujesz od kilku lat, to wiesz, że 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, że 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, że 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śli chodzi o Loom, to pamiętamy, że 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ć, że 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ę, że 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, że 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, że ż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?

5 5 votes
Article Rating
Subscribe
Powiadom o
guest
6 komentarzy
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Michał
Michał
2 lat temu

finally -> finalize()

Mariusz
Mariusz
2 lat temu

Specification 🙂 Specyfication jakoś strasznie po oczach kłuje 😀

Cezary
2 lat temu

Cześć!

Dzięki za zebranie tej wiedzy i zestawienie jej w jednym miejscu z objaśnieniami. 🙂

Pozdrawiam!

6
0
Jestem ciekawy, co myślisz. Dodaj komentarz na dole!x