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, ż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:
Obszar | JDK Enhancement Proposal (JEP) |
Core Java Library | 400: 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 Tools | 413: Code Snippets in Java API Documentation |
Java Specification | 420: 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?
O kolejnych wydaniach Javy możesz przeczytać w artykułach:
finally -> finalize()
Hey Michał, bardzo dziękuję za wyłapanie błędu. Dziękuję!
Specification 🙂 Specyfication jakoś strasznie po oczach kłuje 😀
Hey, dzięki za uwagę.
Cześć!
Dzięki za zebranie tej wiedzy i zestawienie jej w jednym miejscu z objaśnieniami. 🙂
Pozdrawiam!
Dzięki 🙂