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:
- Od Javy 8 do Javy 17 (czyli era zmian po “klasycznej Javie”),
- 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
- Oracle JDK 24 Release Notes
- Bulldogjob: Java 24 — wszystkie nowości
- Pretius: Java 17 features — A comparison between versions 8 and 17
- HappyCoders: Java 24 Features (with Examples)
- InfoWorld: JDK 24 — The new features in Java 24
- Toxigon: JDK 24 New Features
- Oracle JDK 24 Migration Guide