javax.anotación: @Nullable vs @CheckForNull


¿Cuál es la diferencia entre los dos? Ambos parecen significar que el valor puede ser nulo y debe tratarse en consecuencia, es decir, verificarse si es nulo.

Actualización: Las dos anotaciones anteriores son parte de JSR-305 / FindBugs: http://findbugs.sourceforge.net/manual/annotations.html

Author: David Harkness, 2012-09-06

3 answers

Creo que está bastante claro por el enlace que agregaste: si usas @CheckForNull y el código que usa el valor no comprueba null, FindBugs lo mostrará como un error.

FindBugs ignorará @Nullable.

En la práctica, esta anotación es útil solo para sobreescribir una anotación general NonNull.

Use @CheckForNull en los casos en que el valor siempre debe ser comprobado. Use @Nullable donde null podría estar bien.

EDITAR: parece que @CheckForNull no está bien soportado por el momento, así que sugiero evitarla y usar @NonNull (también vea ¿Qué anotación Java @NotNull debo usar?). Otra idea sería ponerse en contacto directamente con los desarrolladores de FindBugs y preguntar su opinión sobre la inconsistencia en la documentación.

 29
Author: lbalazscs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:18

@Nonnull y @Nullable son correctamente manejados por IntelliJ IDEA. FindBugs encontró el problema con @Nonnull pero no los de @Nullable y @CheckForNUll. Los problemas 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());
    }
}
 9
Author: Alexander Pavlov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-17 07:46:06

En IntelliJ la idea @javax.annotation.Nullable está soportada por defecto y cualquier intento de desreferenciar @Nullable argumentos o valores de retorno dará como resultado una advertencia.

@alexander-pavlov, Podría agregar @javax.annotation.CheckForNull en la configuración de la inspección "Condiciones constantes y excepciones". Ir Archivo - > Configuración - > Inspecciones - > Errores probables- > Condiciones y excepciones constantes- > Configurar anotaciones.

Prefiero hacer esto porque @CheckForNull tiene un significado más claro que @Nullable como @lbalazscs mencionó en su respuesta anterior.

 3
Author: Ilya Silvestrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-20 09:14:57