Null-beschränkte und nullable Typen
(bugs.openjdk.org)Null-Restricted and Nullable Types (Preview)
Zusammenfassung
Eine Preview-Sprachfunktion, die Nullness-Marker unterstützt, um bei Java-Typen null zuzulassen oder abzulehnen.
Ziele
- Verbesserung der Java-Referenztypen, damit Programmierer ausdrücken können, ob sie
null-Referenzen erwarten - Unterstützung von Konvertierungen zwischen Typen mit unterschiedlichen Nullness-Eigenschaften sowie Warnungen bei fehlerhaft behandelten
null-Werten - Kompatibilität mit bestehendem Java-Code und Unterstützung einer schrittweisen Einführung der neuen Funktion
- Sicherstellen, dass Variablen von null-beschränkten Typen vor dem ersten Lesen initialisiert werden
- Laufzeitdurchsetzung von null-beschränkten Typen auch in separat kompilierten Klassen
- Bereitstellung der für Laufzeitoptimierungen erforderlichen Metadaten und Integritätsgarantien
Nicht-Ziele
- Bestehenden Code nicht automatisch neu interpretieren
- Nicht verlangen, dass alle
null-Werte explizit behandelt werden - Keine Änderungen an primitiven Typen einschließen
- Sprachverbesserungen nicht auf die Standardbibliothek anwenden
Motivation
- In Java-Programmen kann eine Variable vom Typ
Stringeine Referenz auf einString-Objekt oder den Wertnullhaben - Es lässt sich nicht eindeutig ausdrücken, ob eine Variable
nullzulassen soll, was zu Verwirrung und Bugs führt - Es werden Werkzeuge benötigt, mit denen Entwickler als Teil des Typs festlegen können, ob
nullunterstützt oder erwartet wird
Beschreibung
Nullness-Eigenschaften und Marker
- Referenztypen können Nullness optional ausdrücken
Foo!ist ein null-beschränkter Typ, dernullnicht enthältFoo?ist ein nullable Typ, dernullenthalten kann- Standardmäßig ist die Nullness von
Foonicht festgelegt
Initialisierung von Feldern und Arrays
- Null-beschränkte Felder oder Arrays müssen vor der Verwendung initialisiert werden
- Wird ein nicht initialisiertes null-beschränktes Feld gelesen, tritt eine Ausnahme auf
Ausdrucks-Nullness und Konvertierungen
- Der Java-Compiler bestimmt die Nullness aller Ausdrücke
- Über Nullness-Konvertierungen können Ausdrücke mit unterschiedlicher Nullness verarbeitet werden
- Eine Narrowing-Nullness-Konvertierung kann zur Laufzeit eine
NullPointerExceptionauslösen
Laufzeit-Nullprüfungen
- Tritt eine Narrowing-Nullness-Konvertierung auf, wird eine
NullPointerExceptionausgelöst
Nullness von Typparametern
- Auch Typparameter können Nullness ausdrücken
- Null-beschränkte und nullable Typparameter behaupten in generischem Code eine bestimmte Nullness
Typargumente und Grenzen
- Typargumente können Nullness ausdrücken, was sich auf die Nullness einer API auswirkt
- Typargumente mit nicht übereinstimmender Nullness können Warnungen auslösen
Methodenüberschreibung und Typinferenz für Typargumente
- Nullness wird ignoriert, wenn bestimmt wird, ob Methodensignaturen identisch sind
- Der Rückgabetyp einer überschreibenden Methode kann über Nullness-Konvertierungen umgewandelt werden
Compiler-Warnungen
- Das Erstellen eines null-beschränkten Typs kann neue Compile-Time-Fehler verursachen
- Narrowing-Nullness-Konvertierungen, die Verwendung eines
?-Typs in null-feindlichen Operationen usw. können Warnungen auslösen
Kompilierung und Darstellung in Class-Dateien
- Die meisten Null-Marker werden aus Class-Dateien entfernt
- Das neue Attribut
NullRestrictedzeigt an, dass ein Feld keinenull-Werte zulässt
Core Reflection
- Literale wie
Foo!.classoderFoo?.classexistieren nicht - Die neue RuntimeType-API beschreibt zur Laufzeit null-beschränkte Varianten
Ergänzende Änderungen
- Die traditionelle Serialisierung ist nicht mit null-beschränkten Feldern und Arrays kompatibel
javadocenthält Nullness-Marker- Die APIs
java.lang.reflect.Typeundjavax.lang.modelkodieren Nullness
Alternativen
- Verschiedene Entwicklungswerkzeuge im Java-Ökosystem implementieren eigenes Null-Tracking
- Andere Programmiersprachen verfolgen Nullness im Typsystem
- Laufzeitdurchsetzung von Nullness kann über explizite Prüfungen oder Aufrufe von
Objects.requireNonNullumgesetzt werden
Abhängigkeiten
- Flexible Constructor Bodies (Second Preview) erforderlich
- Zukünftige Arbeiten wie Null-Restricted Value Class Types (Preview) und JEP 402: Enhanced Primitive Boxing (Preview)
Zusammenfassung von GN⁺
- Dieses JEP stellt Werkzeuge bereit, um
null-Werte in Java klarer zu behandeln, und erhöht damit Stabilität und Lesbarkeit des Codes - Durch die Einführung von null-beschränkten und nullable Typen lassen sich Bugs durch
null-Referenzen reduzieren - Die Funktion ist mit bestehendem Code kompatibel und kann schrittweise eingeführt werden, was Entwicklern Flexibilität bietet
- Im Vergleich mit anderen Sprachen kann sie Javas Fähigkeiten im Umgang mit
nullstärken - Ein Werkzeug mit ähnlicher Funktionalität ist etwa die Null-Safety von Kotlin
1 Kommentare
Hacker-News-Kommentare
Vergleich der Null-Behandlung in C# und Kotlin
lateinit vardie Möglichkeit, nicht initialisierte non-nullable Variablen später zu initialisierenMeinungen zum neuen Vorschlag
Bedenken zur automatischen Umwandlung durch nullness narrowing
Notwendigkeit einer Methode, alle Variablen standardmäßig als non-null zu markieren
T!bei fast allen Variablen verwenden, was den Code komplex machtBedarf an einer expliziten Optionality-Funktion auf Sprachebene in Java
Kritik an der Entscheidung, Sprachverbesserungen nicht auf die Standardbibliothek anzuwenden
Bedarf an einer einfachen Möglichkeit, Compile-Time-Warnungen zu Fehlern hochzustufen
Notwendigkeit, standardmäßig non-nullable, immutable und eng eingegrenzt zu setzen
Erfahrungen mit der Null-Behandlung in der Sprache Hack
Frage, ob sich diese Funktion auf das Java SDK anwenden lässt
Relevante Links