Spis treści

Ewolucja języka Java

Podsumowanie ewolucji

Doskonałym źródłem informacji o zmianach w języku Java jest dla mnie wciąż The Java Version Almanac, przeglądam też oficjalne dokumenty na stronie jdk.java.net (n.p. JDK 25 release notes) i od jakiegoś czasu odnoszę wrażenie, że ewolucja języka, a także całego “ekosystemu” znacznie przyspieszyła po wydaniu javy 17.

Dlatego poniżej spróbuję zrobić krótkie podsumowanie najważniejszych zmian wprowadzonych w dwóch przedziałach czasowych:

  1. Od Javy 8 do Javy 17 (czyli era zmian po “klasycznej Javie”),
  2. Od Javy 17 do Javy 21/24 (czyli nowoczesna, projektowo-eksperymentalna Java).

Warto spojrzeć na zmiany w ten sposób, ponieważ obserwuję z doświadczenia, że migracje kodu przebiegają właśnie w takich “skokach” - modernizacja z 8 do 17, a później z 17 do 21. Jaki był temat przewodni tych zmian? Jakiego typu modyfikacje i usprawnienia zostały wprowadzone? Rzućmy na to okiem:

🟩 Zmiany między Java 8 → Java 17 (LTS → LTS)

Lata: 2014–2021
Temat przewodni: Nowoczesny styl pisania kodu, bezpieczeństwo, modularność, przygotowanie gruntu pod większe zmiany.

Obszar Zmiana Wersja
🧱 Modularność Wprowadzenie systemu modułów (module-info.java) Java 9
🌐 HTTP Client API Nowoczesne, reaktywne API do żądań HTTP (java.net.http) Java 11
🛠 API i narzędzia ProcessHandle, Optional.ifPresentOrElse, Files.mismatch Java 9–12
💡 Nowe składnie var dla lokalnych zmiennych (inference) Java 10
🔀 Switch Expressions Nowa, wyrażeniowa forma switch Java 14
🧪 Records Zwięzłe klasy danych (record) Java 14 (preview), Java 16 (final)
🧩 Text Blocks Wieloliniowe literały tekstowe (""") Java 13 (preview), Java 15 (final), wycofane w Java 24
🧠 Pattern Matching for instanceof Skrócenie i uproszczenie instanceof Java 14
🔒 Bezpieczeństwo Silniejsze encapsulowanie JDK, ostrzeżenia przy refleksji Java 16–17
LTS Java 17 jako nowy Long-Term Support Java 17

🟦 Zmiany między Java 17 → Java 24 (21 jako ostatni LTS)

Lata: 2021–2024
Temat przewodni: Projekty Amber, Loom, Panama – ekspresyjność, współbieżność, natywność.

Obszar Zmiana Wersja
🧵 Project Loom Virtual Threads (Thread.ofVirtual()) – lekkie wątki Java 19 (preview), Java 21 (final)
🧪 Pattern Matching – Rozszerzenia switch z patternami, rekordy w instanceof, sealed typy Java 17–21
🧩 Sealed Classes Ograniczanie dziedziczenia, większe bezpieczeństwo typów Java 17
Structured Concurrency API do zarządzania współbieżnością w sposób hierarchiczny Java 21
📦 Foreign Function & Memory API (Panama) Obsługa natywnych bibliotek bez JNI Java 22 (preview), Java 24
🪟 Scoped Values Alternatywa dla ThreadLocal, bezpieczniejsza dla virtual threads Java 20 (preview), Java 21
🧪 Record Patterns Destrukturyzacja danych (record p(var x, var y)) Java 19–21
🚀 Start-up / Performance Lepszy GC (ZGC, Shenandoah), optymalizacje startu JVM Java 17–24
🧰 Nowe narzędzia CLI jwebserver, lepsze jshell, jpackage, jdeps Java 18–21
LTS Java 21 jako najnowszy Long-Term Support Java 21

🔄 Różnice w podejściu: Java 8–17 vs Java 17–24

Cecha Java 8–17 Java 17–24
Fokus Modernizacja języka i API Przyszłość: współbieżność, natywność
Tempo zmian Umiarkowane Szybkie, z preview features
Stabilność Wiele LTS-ów, bez rewolucji Preview co wersję, integracja eksperymentów
Styl programowania Klasyczny + nowoczesne elementy W pełni nowoczesny, funkcjonalny, ekspresyjny
Cechy języka - Lambdy, Stream API, interfejsy domyślne, Optional
- Rekordy (Java 14), pattern matching (Java 16–17)
- Rozszerzone pattern matching (instanceof, switch)
- Proste pliki źródłowe
- Elastyczne ciała konstruktorów
Zarządzanie pamięcią (GC) - Parallel GC, G1 GC
- ZGC, Shenandoah (eksperymentalne od Java 11–15)
- Generacyjny Shenandoah GC
- ZGC tylko w trybie generacyjnym
- Kompaktowe nagłówki obiektów (eksperymentalne)
Współbieżność - Tradycyjne wątki, synchronized
- Brak lekkich wątków
- Wirtualne wątki
- Strukturalna współbieżność
- Synchronizacja bez przypinania wątków
Bezpieczeństwo - Podstawowe algorytmy kryptograficzne
- Brak wsparcia dla kryptografii odpornej na kwanty
- Algorytmy ML-KEM, ML-DSA (post-quantum)
- API funkcji wyprowadzania kluczy (KDF)
API i biblioteki - Stream API, Optional
- Wsparcie dla monitorowania JVM
- API plików klas
- Stream Gatherers
- Scoped Values
Wydajność i uruchamianie - Standardowy czas uruchamiania
- Brak optymalizacji dla krótkich aplikacji
- Wstępne ładowanie i łączenie klas
- Kompaktowe nagłówki obiektów zmniejszające zużycie pamięci
Modularność - System modułów (Java 9)
- Brak uproszczonych deklaracji importu
- Deklaracje importu modułów (uproszczone)

📚 Źródła