Tipos con restricción de null y tipos anulables
(bugs.openjdk.org)Null-Restricted and Nullable Types (Preview)
Resumen
Una función preliminar del lenguaje que admite marcadores de nulidad que permiten o rechazan null en los tipos de Java.
Objetivos
- Mejorar los tipos de referencia de Java para que los programadores puedan expresar si esperan o no referencias
null - Admitir conversiones entre tipos con distintos atributos de nulidad y proporcionar advertencias sobre valores
nullmal manejados - Mantener compatibilidad con el código Java existente y permitir la adopción gradual de la nueva funcionalidad
- Garantizar que las variables de tipos con restricción de
nullse inicialicen antes de su primera lectura - Hacer cumplir en tiempo de ejecución los tipos que rechazan
null, incluso en clases compiladas por separado - Proporcionar los metadatos y las garantías de integridad necesarios para optimizaciones en tiempo de ejecución
No objetivos
- No reinterpretar automáticamente el código existente
- No exigir que todos los valores
nullse manejen explícitamente - No incluir cambios para tipos primitivos
- No aplicar las mejoras del lenguaje a la biblioteca estándar
Motivación
- En los programas Java, una variable de tipo
Stringpuede contener una referencia a un objetoStringo un valornull - Como no se puede expresar claramente si una variable permite o no
null, esto genera confusión y errores - Se necesitan herramientas para que los desarrolladores puedan indicar, como parte del tipo, si un valor
nulles esperado o no está permitido
Descripción
Atributos y marcadores de nulidad
- Los tipos de referencia pueden expresar opcionalmente su nulidad
Foo!es un tipo con restricción denullque no incluyenullFoo?es un tipo anulable que incluyenull- Por defecto, la nulidad de
Foono está especificada
Inicialización de campos y arreglos
- Los campos o arreglos con restricción de
nulldeben inicializarse antes de usarse - Si se intenta leer un campo con restricción de
nullque no fue inicializado, se produce una excepción
Nulidad de expresiones y conversiones
- El compilador de Java determina la nulidad de cada expresión
- Las conversiones de nulidad permiten manejar expresiones con distinta nulidad
- Las conversiones de nulidad de estrechamiento pueden provocar un
NullPointerExceptionen tiempo de ejecución
Verificación de null en tiempo de ejecución
- Cuando ocurre una conversión de nulidad de estrechamiento, se produce un
NullPointerException
Nulidad de variables de tipo
- Las variables de tipo también pueden expresar nulidad
- Las variables de tipo con restricción de
nully las anulables afirman una nulidad específica dentro del código genérico
Argumentos de tipo y límites
- Los argumentos de tipo pueden expresar nulidad, y esto afecta la nulidad de la API
- Los argumentos de tipo con nulidad incompatible pueden generar advertencias
Sobrescritura de métodos e inferencia de argumentos de tipo
- La nulidad se ignora al determinar si las firmas de métodos son iguales
- El tipo de retorno de un método sobrescrito puede convertirse mediante conversiones de nulidad
Advertencias del compilador
- Crear un tipo con restricción de
nullpuede generar nuevos errores en tiempo de compilación - Las conversiones de nulidad de estrechamiento, el uso de tipos
?en operaciones hostiles anull, etc., pueden generar advertencias
Compilación y representación en archivos de clase
- La mayoría de los marcadores de nulidad se eliminan de los archivos de clase
- El nuevo atributo
NullRestrictedindica que un campo no permite valoresnull
Reflexión principal
- No existen literales
Foo!.classniFoo?.class - La nueva API
RuntimeTypedescribe en tiempo de ejecución las variantes con restricción denull
Cambios complementarios
- La serialización tradicional no es compatible con campos y arreglos con restricción de
null javadocincluye marcadores de nulidad- Las API
java.lang.reflect.Typeyjavax.lang.modelcodifican la nulidad
Alternativas
- Diversas herramientas de desarrollo del ecosistema Java implementan su propio seguimiento de nulidad
- Otros lenguajes de programación rastrean la nulidad dentro del sistema de tipos
- La aplicación de nulidad en tiempo de ejecución puede implementarse con verificaciones explícitas o llamadas a
Objects.requireNonNull
Dependencias
- Requiere Flexible Constructor Bodies (Second Preview)
- Trabajos futuros como Null-Restricted Value Class Types (Preview) y JEP 402: Enhanced Primitive Boxing (Preview)
Resumen de GN⁺
- Este JEP ofrece herramientas para manejar con claridad los valores
nullen Java, mejorando la estabilidad y legibilidad del código - La introducción de tipos con restricción de
nully tipos anulables puede reducir errores causados por referenciasnull - Es compatible con el código existente y puede adoptarse de forma gradual, lo que da flexibilidad a los desarrolladores
- En comparación con otros lenguajes, puede fortalecer la capacidad de Java para manejar
null - Una herramienta con funcionalidad similar es la seguridad de nulidad de Kotlin
1 comentarios
Comentarios de Hacker News
Comparación de cómo C# y Kotlin manejan
nulllateinit varOpiniones sobre la nueva propuesta
Preocupaciones sobre la conversión automática de nullness-narrowing
Necesidad de una forma de marcar todas las variables como non-null por defecto
T!en casi todas las variables, lo que complica el códigoNecesidad de una función de optionality explícita a nivel de lenguaje en Java
Críticas a la decisión de no aplicar las mejoras del lenguaje a la biblioteca estándar
Necesidad de una forma sencilla de elevar advertencias de compilación a errores
Necesidad de que por defecto todo sea non-nullable, immutable y de alcance reducido
Experiencia con el manejo de
nullen el lenguaje HackPregunta sobre si esta función puede aplicarse al SDK de Java
Enlaces relacionados