Po premierze Java 14 w marcu 2020 został zaplanowany kolejny upadate. Nowa wersja Java 15 nie jest tak bogata w zamiany jak poprzedniczka i wdraża głownie zmiany znane nam z poprzednich wersji, więc na spektakularne zmiany nie mamy co liczyć 🙂
Java 15 – lista zmian
Wersje testową możesz pobrać z JDK 15 Early-Access Builds
1. Hidden Classes [JEP 371]
To jedna z ciekawszych zmian jaką możemy się spodziewać w ramach nowej odsłony Java. Jednak nie ma jeszcze potwierdzonej oficjalnie informacji, czy nowość ta zadebiutuje w wersji JDK 15, czy dopiero JDK 16.
Klasy ukryte to klasy, które nie mogą być używane bezpośrednio przez kod bajtowy innych klas.
Zamiast tego, klasy ukryte są przeznaczone do używania przez frameworki, które generują klasy w czasie wykonywania i używają ich pośrednio poprzez refleksję.
Ukryta klasa nie jest wykrywana przez JVM podczas łączenia kodu bajtowego. Ukrytą klasę można rozładować, gdy nie jest ona już osiągalna, lub może współdzielić żywotność modułu ładującego klasy, dzięki czemu jest rozładowywana tylko wtedy, gdy class loader jest wyczyszczany przez garbage collector.
Przykład:
W przypadku języka Java, to javac nie tłumaczy wyrażenia lambda na dedykowany plik klasy w czasie kompilacji, ale emituje kod bajtowy, który dynamicznie generuje i tworzy instancję klasy, aby w razie potrzeby uzyskać obiekt odpowiadający wyrażeniu lambda.
2. Remove the Nashorn JavaScript Engine [JEP 372]
Project Nashorn umożliwia na uruchomienie kodu JavaScript w Java przy wykorzystaniu natywnej JVM. Zadebiutował on w Java 8, natomiast został oznaczony jako deprecated w Java 11.
Wersja JDK 15 wycofuje silnik skryptowy JavaScript i interfejsy API Nashorn ze względu na trudność w utrzymaniu.
3. ZGC: A Scalable Low-Latency Garbage Collector [JEP 377]
Bardzo wydajny Garbage Collector ZGC, który zadebiutował w ramach Java 11 w wersji eksperymentalnej otrzymał status rozwiązania produkcyjnego.
Warto wspomnieć, że Java w wersji 13 poprawiła jego funkcjonowanie, aby mógł zwracać niewykorzystaną pamięć do systemu operacyjnego.
Natomiast wersja JDK 14 wprowadziła możliwość wykorzystania ZGC w ramach systemów operacyjnych Windows oraz macOS. Wcześniej działał jednie pod kontrolą Linuxa.
Pomimo, że ZGC otrzymał status rozwiązania do stosowania na produkcji, to nadal domyślnym Garbage Collector’em pozostaje G1.
4. Text Blocks [JEP 378]
Text Blocks, które zaprezentowano w wersji preview w JDK 13, a następnie zmodyfikowano w wersji JDK 14 zyskało status produkcyjny.
Dla przypomnienia Text Blocks teraz umożliwia czytelny sposób na zapis wieloliniowych ciągów tekstowych.
Przykład HTML
one-dimensional String
String html = "<html>\n" + " <body>\n" + " <p>Hello, world</p>\n" + " </body>\n" + "</html>\n";
two-dimensional String
String html = """ <html> <body> <p>Hello, world</p> </body> </html> """;
Przykład SQL
one-dimensional String
String query = "SELECT \"EMP_ID\", \"LAST_NAME\" FROM \"EMPLOYEE_TB\"\n" + "WHERE \"CITY\" = 'INDIANAPOLIS'\n" + "ORDER BY \"EMP_ID\", \"LAST_NAME\";\n";
two-dimensional String
String query = """ SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB" WHERE "CITY" = 'INDIANAPOLIS' ORDER BY "EMP_ID", "LAST_NAME"; """;
Niestety zmiana jest dosyć kontrowersyjna, ponieważ jest ona pośrednim przyzwoleniem na mieszanie języków w ramach jednej klasy. Wcześniej, aby zapobiec temu bałaganowi kod SQL lub HTML izolowaliśmy do innych plików.
Jedyne miejsce, gdzie stosowanie Text Block’ów jest uzasadnione to testy jednostkowe, w ramach którego możemy zdefiniować Text Block, po to, aby ograniczyć ilość tworzonych plików dla testów.
5. Shenandoah: A Low-Pause-Time Garbage Collector (Production) [JEP 379]
ZGC i Shenandoah to Garbage Collector’y, które mają bardzo podobne założenia (krótki czas pauzy). Stosują jednak zupełnie inną strategię implementacji – Shenandoah używa Brooks pointers, podczas gdy ZGC używa colored pointers i multiple-memory-mappings.
Jednak to ZGC jest często wydajniejszy pod względem przepustowości i czasów pauzy.
Shenandoah to GC, który zadebiutował w wersji JDK 12, natomiast w tej wersji podobnie jak ZGC zyskał status rozwiązania produkcyjnego.
Java 15 – podsumowanie
JDK 15 nie dostarczył nam zaskakujących nowości. Aktualna wersja zamyka wiele wcześniej otwartych JEP’ów, które wchodzą do najnowszej Jawy bez modyfikacji. Jednak po tylu ciekawych zmianach jakie spotkały nas w ramach JDK 14, to Java developerzy nie mają co narzekać 🙂