java - online - sonar code analyzer
javax.annotation: @Nullable vs @CheckForNull (3)
¿Cuál es la diferencia entre los dos? Ambos parecen querer decir que el valor puede ser nulo y debe tratarse en consecuencia, es decir, debe verificarse si es nulo.
Actualización: las dos anotaciones anteriores son parte de JSR-305 / FindBugs: http://findbugs.sourceforge.net/manual/annotations.html
@Nonnull
y @Nullable
son manejados correctamente por IntelliJ IDEA. FindBugs encontró el problema con @Nonnull
pero se perdió los de @Nullable
y @CheckForNUll
. Los problemas que fueron detectados por IDEA y FindBugs están marcados con comentarios.
package com.db.icestation;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class test {
public @Nullable String nullable() {
return "";
}
public @Nonnull String nonnull() {
return null; // IDEA, findbugs
}
public @CheckForNull String checkForNull() {
return null;
}
public static void main(String[] args) {
System.out.println(new test().nullable().length()); // IDEA
System.out.println(new test().nonnull().length());
System.out.println(new test().checkForNull().length());
}
}
En IntelliJ Idea @javax.annotation.Nullable
es compatible por defecto y cualquier intento de desreferenciar argumentos @Nullable
o devolver valores dará como resultado una advertencia.
@ alexander-pavlov, puede agregar @javax.annotation.CheckForNull
en la configuración de la inspección "Condiciones constantes y excepciones". Vaya a Archivo-> Configuración-> Inspecciones-> Errores probables-> Condiciones constantes y excepciones-> Configure las anotaciones.
Prefiero hacer esto ya que @CheckForNull
tiene un significado más claro que @Nullable
como @lbalazscs mencionado en su respuesta anterior.
Creo que está bastante claro desde el enlace que agregaste: si usas @CheckForNull
y el código que usa el valor no marca null
, FindBugs lo mostrará como un error.
FindBugs ignorará @Nullable
.
En la práctica, esta anotación solo es útil para anular una anotación general no
NonNull
.
Use @CheckForNull
en los casos en que el valor siempre debe estar marcado. Use @Nullable
donde null
podría estar bien.
EDITAR: parece que @CheckForNull
no está bien soportado en este momento, por lo que sugiero evitarlo y usar @NonNull
(también ver ¿Qué anotación @NotNull Java debería usar? ). Otra idea sería ponerse en contacto directamente con los desarrolladores de FindBugs y pedirles su opinión sobre la incoherencia en la documentación.