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.