@ Uso de anotaciones anulables

347

Vi algún método en Java declarado como:

void foo(@Nullable Object obj)
{ ... }

¿Qué significa @Nullableaquí? ¿Significa que la entrada podría ser null?

Sin la anotación, la entrada aún puede ser nula, así que supongo que no es solo eso.

usuario1508893
fuente
3
De las respuestas a continuación, he aprendido que la anotación indica que los valores nulos son aceptables, ejemplos de dónde se usa, analizadores de código que puedo probar y que las interpretaciones pueden variar. ¿Ves por qué este formato es bueno? +1 en general, especialmente por hacer esta pregunta.
agua helada
8
¿Qué biblioteca proporciona @Nullableen el contexto de su pregunta? ¿Es el corrector?
8bitjunkie

Respuestas:

367

Deja en claro que el método acepta valores nulos y que si anula el método, también debe aceptar valores nulos.

También sirve como una pista para analizadores de código como FindBugs . Por ejemplo, si un método de este tipo desreferencia su argumento sin verificar primero nulo, FindBugs emitirá una advertencia.

JB Nizet
fuente
82

Esta anotación se usa comúnmente para eliminar NullPointerExceptions. @Nullabledice que este parámetro podría ser null. Un buen ejemplo de este comportamiento se puede encontrar en Google Guice . En este marco de inyección de dependencias ligero, puede decir que esta dependencia podría ser null. Si intenta pasar nullsin una anotación, el marco se negaría a hacer su trabajo.

Lo que es más, @Nullablepodría usarse con @NotNullanotaciones. Aquí puede encontrar algunos consejos sobre cómo usarlos correctamente. La inspección de código en IntelliJ verifica las anotaciones y ayuda a depurar el código.

Adam Sznajder
fuente
1

De acuerdo, definitivamente hay un pensamiento diferente, en mi mundo, no puedo imponer "Nunca pasar un nulo" porque estoy tratando con terceros incontrolables como llamadas de API, registros de bases de datos, antiguos programadores, etc., así que soy paranoico y defensivo en los enfoques . Como estás en Java8 o posterior, hay un enfoque un poco más limpio que un ifbloque.

public String foo(@Nullable String mayBeNothing) {
   return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}

También puede lanzar alguna excepción al cambiar .orElsea orElseThrow(() -> new Exception("Dont' send a null")).

Si no desea utilizar @Nullable, que no agrega nada funcionalmente, ¿por qué no solo nombra el parámetro mayBe...para que su intención sea clara?

Manabu Tokunaga
fuente