in

¿Qué es nulo en Java?

apple touch icon@2

¿Es null una instancia de algo?

No, no hay ningún tipo que null es un instanceof.

15.20.2 Operador de comparación de tipos instanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

En tiempo de ejecución, el resultado de la instanceof el operador es true si el valor del Expresión relacional no es null y la referencia podría lanzarse a la Tipo de referencia sin levantar un ClassCastException. De lo contrario, el resultado es false.

Esto significa que para cualquier tipo E y R, para cualquier E o, dónde o == null, o instanceof R es siempre false.


¿A qué conjunto pertenece ‘nulo’?

JLS 4.1 Los tipos de tipos y valores

También hay un especial nulo type, el tipo de expresión null, que no tiene nombre. Porque el nulo tipo no tiene nombre, es imposible declarar una variable de la nulo escribir o lanzar a la nulo escribe. los null referencia es el único valor posible de una expresión de nulo escribe. los null la referencia siempre se puede convertir a cualquier tipo de referencia. En la práctica, el programador puede ignorar la nulo escribe y finge que null es simplemente un literal especial que puede ser de cualquier tipo de referencia.


¿Qué es nulo?

Como dice la cita de JLS anterior, en la práctica puede simplemente pretender que es «simplemente un literal especial que puede ser de cualquier tipo de referencia».

En Java, null == null (este no es siempre el caso en otros idiomas). Tenga en cuenta también que por contrato, también tiene esta propiedad especial (desde java.lang.Object):

public boolean equals(Object obj)

Para cualquier nonull valor de referencia x, x.equals(null) deberían return false.

También es el valor por defecto (para variables que las tengan) para todos los tipos de referencia:

JLS 4.12.5 Valores iniciales de variables

  • Cada variable de clase, variable de instancia o componente de matriz se inicializa con un valor por defecto cuando se crea:
    • Para todos los tipos de referencia, el valor predeterminado es null.

La forma en que se usa varía. Puede usarlo para habilitar lo que se llama inicialización perezosa de campos, donde un campo tendría su valor inicial de null hasta que se use realmente, donde se reemplaza por el valor «real» (que puede ser costoso de calcular).

También hay otros usos. Tomemos un ejemplo real de java.lang.System:

public static Console console()

Devoluciones: La consola del sistema, si la hay, de lo contrario null.

Este es un patrón de uso muy común: null se utiliza para denotar la inexistencia de un objeto.

Aquí hay otro ejemplo de uso, esta vez de java.io.BufferedReader:

public String readLine() throws IOException

Devoluciones: A String que contenga el contenido de la línea, sin incluir ningún carácter de terminación de línea, o null si se ha llegado al final de la secuencia.

Así que aquí readLine() volvería instanceof String para cada línea, hasta que finalmente devuelve un null para significar el final. Esto le permite procesar cada línea de la siguiente manera:

String line;
while ((line = reader.readLine()) != null) {
   process(line);
}

Se puede diseñar la API para que la condición de terminación no dependa de readLine() regresando null, pero se puede ver que este diseño tiene la ventaja de hacer las cosas concisas. Tenga en cuenta que no hay ningún problema con las líneas vacías, porque una línea vacía "" != null.

Tomemos otro ejemplo, esta vez de java.util.Map<K,V>:

V get(Object key)

Devuelve el valor al que se asigna la clave especificada, o null si este mapa no contiene ningún mapeo para la clave.

Si este mapa lo permite null valores, luego un valor de retorno de null no indica necesariamente que el mapa no contenga ningún mapeo para la clave; También es posible que el mapa asigne explícitamente la clave a null. los containsKey La operación se puede utilizar para distinguir estos dos casos.

Aquí comenzamos a ver cómo usar null puede complicar las cosas. La primera declaración dice que si la clave no está asignada, null es regresado. La segunda declaración dice que incluso si la clave está asignada, null pueden además ser devueltos.

A diferencia de, java.util.Hashtable mantiene las cosas más simples al no permitir null claves y valores; su V get(Object key), si regresa null, significa inequívocamente que la clave no está asignada.

Puede leer el resto de las API y encontrar dónde y cómo null se utiliza. Tenga en cuenta que no siempre son los mejores prácticas ejemplos.

Generalmente hablando, null se utilizan como un valor especial para significar:

  • Estado no inicializado
  • Condición de terminación
  • Objeto inexistente
  • Un valor desconocido

¿Cómo se representa en la memoria?

¿En Java? Nada de tu incumbencia. Y es mejor mantenerlo así.


Es null ¿una cosa buena?

Esto es ahora casi subjetivo. Algunas personas dicen que null provoca muchos errores del programador que podrían haberse evitado. Algunos dicen que en un idioma que atrapa NullPointerException como Java, es bueno usarlo porque fallará rápidamente en los errores del programador. Algunas personas evitan null mediante el uso Patrón de objeto nuloetc.

Este es un tema enorme en sí mismo, por lo que es mejor discutirlo como respuesta a otra pregunta.

Terminaré esto con una cita del inventor de null él mismo, COCHE Hoare (de fama de clasificación rápida):

Yo lo llamo mi error de mil millones de dólares. Fue la invención de la null referencia en 1965. En ese momento, estaba diseñando el primer sistema de tipos completo para referencias en un lenguaje orientado a objetos (ALGOL W). Mi objetivo era garantizar que todo uso de referencias fuera absolutamente seguro, y que el compilador las verificara automáticamente. Pero no pude resistir la tentación de poner un null referencia, simplemente porque era muy fácil de implementar. Esto ha llevado a innumerables errores, vulnerabilidades y caídas del sistema, que probablemente han causado mil millones de dólares en dolor y daño en los últimos cuarenta años.

los video de esta presentación va más profundo; es un reloj recomendado.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

HTML – Comentarios

gfg 200x200 min

Python | Diferencia entre iterable e iterador