Neues in Java 9
Im März 2014 wurde Java 8 final und der Nachfolger ist Java 9. Der Zeitplan bis zum Release war:
- 2016-05-26 Feature Complete ✔
- 2016-12-22 Feature Extension Complete ✔
- 2017-01-05 Rampdown Start ✔
- 2017-02-09 All Tests Run ✔
- 2017-02-16 Zero Bug Bounce ✔
- 2017-03-16 Rampdown Phase 2 ✔
- 2017-07-06 Final Release Candidate ✔
- 2017-09-21 General Availability ✔
Der Nachfolger von Java 9 ist Java 10 (aka Java 18.3), was seit März 2018 verfügbar ist.
JEPs (JDK Enhancements)
Die wichtigsten JEPs (JDK Enhancements) für Java 9:
Wichtige Features
- JEP 102: Process API Updates - Improve the API for controlling and managing operating-system processes
- JEP 110: HTTP/2 Client - Define a new HTTP client API that implements HTTP/2 and WebSocket
- JEP 200: The Modular JDK - Use the Java Platform Module System to modularize the JDK
- JEP 220: Modular Run-Time Images - Restructure the JDK and JRE run-time images to accommodate modules
- JEP 222: jshell: The Java Shell (Read-Eval-Print Loop) - Provide an interactive tool to evaluate declarations, statements, and expressions
- JEP 238: Multi-Release JAR Files - Allow multiple, Java-release-specific versions of class files to coexist in a single archive
- JEP 261: Module System - Implement the Java Platform Module System
- JEP 269: Convenience Factory Methods for Collections - Define library APIs to make it convenient to create instances of collections and maps
Weitere JEPs
- JEP 143: Improve Contended Locking
- JEP 158: Unified JVM Logging
- JEP 165: Compiler Control
- JEP 193: Variable Handles
- JEP 197: Segmented Code Cache
- JEP 199: Smart Java Compilation, Phase Two
- JEP 201: Modular Source Code
- JEP 211: Elide Deprecation Warnings on Import Statements
- JEP 212: Resolve Lint and Doclint Warnings
- JEP 213: Milling Project Coin
- JEP 214: Remove GC Combinations Deprecated in JDK 8
- JEP 215: Tiered Attribution for javac
- JEP 216: Process Import Statements Correctly
- JEP 217: Annotations Pipeline 2.0
- JEP 219: Datagram Transport Layer Security (DTLS)
- JEP 221: Simplified Doclet API
- JEP 223: New Version-String Scheme
- JEP 224: HTML5 Javadoc
- JEP 225: Javadoc Search
- JEP 226: UTF-8 Property Files
- JEP 227: Unicode 7.0
- JEP 228: Add More Diagnostic Commands
- JEP 229: Create PKCS12 Keystores by Default
- JEP 231: Remove Launch-Time JRE Version Selection
- JEP 232: Improve Secure Application Performance
- JEP 233: Generate Run-Time Compiler Tests Automatically
- JEP 235: Test Class-File Attributes Generated by javac
- JEP 236: Parser API for Nashorn
- JEP 237: Linux/AArch64 Port
- JEP 240: Remove the JVM TI hprof Agent
- JEP 241: Remove the jhat Tool
- JEP 243: Java-Level JVM Compiler Interface
Und weitere JEPs (244-295) für verschiedene Verbesserungen und neue Features.
Modulsystem Jigsaw
In den letzten Jahren gab es immer Diskussionen um ein Modulsystem. Dabei vermischen sich zwei Dinge: einmal, dass Oracle selbst für das JDK intern ein Modulsystem nutzen möchte und einmal, dass Entwickler selbst ihre Anwendungen modularisieren können, so ähnlich wie es mit OSGi möglich ist. Das Modulsystem war eigentlich soweit fertig, wurde dann aber doch auf Java 9 verschoben.
Modulsystem Ressourcen:
- http://openjdk.java.net/projects/jigsaw/
- Quick Start Guide
- Modular Services
- Java Language Modularity With Superpackages (SunOne 2007)
Repository und Dokumentation
Wie beim Java 8 bildet das OpenJDK die Referenzimplementierung, auf deren Basis das Oracle JDK stehen wird. Das Mercurial Repository ist offen. Change-Sets der Builds dokumentieren die Änderungen.
Mailing-Listen:
IDE-Unterstützung
Java 9 nutzt für den Compiler die neue Modul-Infrastruktur, weshalb eine IDE angepasst werden muss. Aktuelle Versionen von Eclipse unterstützen längst Java 9, das gleiche gilt für IntelliJ und sogar NetBeans.
Wichtige Neuerungen im Detail
Collection Factory Methods (JEP 269)
Java 9 führt neue Factory-Methoden für Collections ein:
List<String> list = List.of("a", "b", "c");
Set<String> set = Set.of("a", "b", "c");
Map<String, Integer> map = Map.of("a", 1, "b", 2);
Stream API Erweiterungen
Neue Methoden in der Stream API:
takeWhile()- nimmt Elemente solange eine Bedingung erfüllt istdropWhile()- überspringt Elemente solange eine Bedingung erfüllt istStream.ofNullable()- erstellt einen Stream aus einem möglicherweise null-Wert
Optional Verbesserungen
ifPresentOrElse()- führt eine Aktion aus wenn Wert vorhanden ist, sonst eine andereor()- gibt einen alternativen Optional zurück wenn leerstream()- konvertiert Optional zu Stream
Process API (JEP 102)
Verbesserte API zur Prozesskontrolle:
ProcessHandle- bessere Kontrolle über ProzesseProcessBuilder.startPipeline()- Prozess-Pipelines- Informationen über Prozess-IDs und Hierarchien
HTTP/2 Client (JEP 110)
Neuer HTTP Client mit HTTP/2 und WebSocket-Unterstützung als Incubator-Feature.
Neue Typen und wichtige API-Änderungen
Java 9 bringt hunderte neuer Methoden und Typen mit sich, darunter:
- Module System:
java.lang.Module,java.lang.ModuleLayer, verschiedene Moduldeskriptor-Klassen - Multi-Resolution Images: Unterstützung für verschiedene Auflösungen in Images
- Variable Handles: Low-level Zugriff auf Felder und Array-Elemente
- Stack-Walking API: Effiziente Analyse von Stack-Traces
- Desktop Integration: Erweiterte Desktop-Features für plattformspezifische Integration
Entfernte Features
- Java Applets: Die Applet API wurde als deprecated markiert
- Diverse @Deprecated Tools: Verschiedene Tools und APIs wurden entfernt oder als deprecated markiert
Fazit
Java 9 ist ein bedeutender Meilenstein in der Java-Entwicklung, hauptsächlich durch das neue Modulsystem (Project Jigsaw). Weitere wichtige Verbesserungen umfassen die Collection Factory Methods, Stream API Erweiterungen, die neue Process API und viele kleinere Verbesserungen in der Standard-Bibliothek.
Das Modulsystem ermöglicht es, kleinere Runtime-Images zu erstellen und bessere Kapselung zu erreichen, was besonders für große Anwendungen und die JDK-Entwicklung selbst von Vorteil ist.