Types à null restreint et types nullable
(bugs.openjdk.org)Null-Restricted and Nullable Types (Preview)
Résumé
Fonctionnalité de langage en préversion prenant en charge des marqueurs de nullité qui autorisent ou refusent null dans les types Java.
Objectifs
- Améliorer les types de référence de Java afin de permettre aux programmeurs d’exprimer s’ils attendent ou non une référence
null - Prendre en charge les conversions entre des types ayant des propriétés de nullité différentes, et fournir des avertissements sur les valeurs
nullmal gérées - Rester compatible avec le code Java existant et permettre une adoption progressive de la nouvelle fonctionnalité
- Garantir que les variables de type refusant
nullsont initialisées avant leur première lecture - Appliquer à l’exécution les types refusant
null, y compris dans des classes compilées séparément - Fournir les métadonnées nécessaires et des garanties d’intégrité pour les optimisations à l’exécution
Non-objectifs
- Ne pas réinterpréter automatiquement le code existant
- Ne pas exiger un traitement explicite de toutes les valeurs
null - Ne pas inclure de changements pour les types primitifs
- Ne pas appliquer cette amélioration du langage à la bibliothèque standard
Motivation
- Dans les programmes Java, une variable de type String peut contenir une référence vers un objet String ou la valeur
null - Comme il n’existe pas de moyen clair d’exprimer si une variable autorise
nullou non, cela entraîne de la confusion et des bugs - Il est nécessaire de fournir aux développeurs un outil leur permettant d’indiquer, comme partie du type, si une valeur
nullest attendue ou non prise en charge
Description
Propriétés de nullité et marqueurs
- Les types de référence peuvent exprimer optionnellement la nullité
Foo!est un type à null restreint qui n’inclut pasnullFoo?est un type nullable qui inclutnull- Par défaut, la nullité de
Foon’est pas spécifiée
Initialisation des champs et des tableaux
- Les champs ou tableaux à null restreint doivent impérativement être initialisés avant utilisation
- La lecture d’un champ à null restreint non initialisé provoque une exception
Nullité des expressions et conversions
- Le compilateur Java détermine la nullité de chaque expression
- Les conversions de nullité permettent de manipuler des expressions ayant des nullités différentes
- Une conversion de nullité restrictive peut déclencher une
NullPointerExceptionà l’exécution
Vérification de null à l’exécution
- Lorsqu’une conversion de nullité restrictive se produit, une
NullPointerExceptionest levée
Nullité des variables de type
- Les variables de type peuvent aussi exprimer la nullité
- Les variables de type à null restreint et nullable affirment une nullité spécifique dans le code générique
Arguments de type et bornes
- Les arguments de type peuvent exprimer la nullité, ce qui influence la nullité de l’API
- Des arguments de type dont la nullité ne correspond pas peuvent produire des avertissements
Redéfinition de méthodes et inférence des arguments de type
- La nullité est ignorée pour déterminer si des signatures de méthode sont identiques
- Le type de retour d’une méthode redéfinie peut être converti via une conversion de nullité
Avertissements du compilateur
- Créer un type à null restreint peut introduire de nouvelles erreurs à la compilation
- Les conversions de nullité restrictives, l’utilisation d’un type
?dans des opérations hostiles ànull, etc., peuvent produire des avertissements
Compilation et représentation dans les fichiers de classe
- La plupart des marqueurs de nullité sont supprimés des fichiers de classe
- Un nouvel attribut NullRestricted indique qu’un champ n’accepte pas la valeur
null
Core Reflection
- Les littéraux
Foo!.classetFoo?.classn’existent pas - La nouvelle API RuntimeType décrit à l’exécution les variantes à null restreint
Changements complémentaires
- La sérialisation traditionnelle n’est pas compatible avec les champs et tableaux à null restreint
javadocinclut les marqueurs de nullité- Les API
java.lang.reflect.Typeetjavax.lang.modelencodent la nullité
Alternatives
- Divers outils de développement de l’écosystème Java implémentent déjà leur propre suivi de la nullité
- D’autres langages de programmation suivent la nullité dans leur système de types
- L’application de la nullité à l’exécution peut être implémentée avec des vérifications explicites ou des appels à
Objects.requireNonNull
Dépendances
- Flexible Constructor Bodies (Second Preview) est requis
- Travaux futurs tels que Null-Restricted Value Class Types (Preview) et JEP 402: Enhanced Primitive Boxing (Preview)
Récapitulatif de GN⁺
- Ce JEP fournit à Java des outils pour gérer plus explicitement les valeurs
null, améliorant ainsi la robustesse et la lisibilité du code - L’introduction des types à null restreint et nullable peut réduire les bugs liés aux références
null - La compatibilité avec le code existant et l’adoption progressive offrent de la flexibilité aux développeurs
- Par comparaison avec d’autres langages, cela peut renforcer les capacités de Java en matière de gestion de
null - Kotlin propose une fonctionnalité comparable avec sa null-safety
1 commentaires
Commentaires Hacker News
Comparaison des approches de C# et Kotlin pour la gestion de
nulllateinit varAvis sur la nouvelle proposition
Inquiétudes concernant les conversions automatiques de nullness narrowing
Nécessité d’un moyen pour marquer toutes les variables comme non nulles par défaut
T!pour presque toutes les variables, ce qui alourdit le codeBesoin d’une fonctionnalité d’optionalité explicite au niveau du langage en Java
Critique de la décision de ne pas appliquer ces améliorations du langage à la bibliothèque standard
Besoin d’un moyen simple pour promouvoir les avertissements de compilation en erreurs
Nécessité d’avoir par défaut des variables non nullables, immuables et à portée réduite
Retour d’expérience sur la gestion de
nulldans le langage HackQuestion sur la possibilité d’appliquer cette fonctionnalité au SDK Java
Liens associés