javax.annotation: @Nullable vs @CheckForNull

Quelle est la différence entre les deux? Les deux semblent signifier que la valeur peut être nulle et doit être traitée en conséquence, c'est-à-dire vérifiée pour null.

mise à Jour: Les deux annotations ci-dessus font partie du JSR-305 / FindBugs: http://findbugs.sourceforge.net/manual/annotations.html

38
demandé sur David Harkness 2012-09-06 17:47:58

3 réponses

je pense que c'est assez clair à partir du lien que vous avez ajouté: si vous utilisez @CheckForNull et le code qui utilise la valeur ne vérifie pas null , FindBugs le montrera comme une erreur.

FindBugs ignorera @Nullable .

dans la pratique, cette annotation n'est utile que pour remplacer une annotation générale NonNull .

utiliser @CheckForNull dans les cas où la valeur doit toujours être vérifiée. Utilisez @Nullablenull pourrait être OK.

EDIT: il semble que @CheckForNull ne soit pas bien supporté pour le moment, donc je suggère de l'éviter et d'utiliser @NonNull (voir aussi que @NotNull Java annotation devrait-il utiliser? ). Une autre idée serait d'entrer en contact directement avec les développeurs de FindBugs, et de demander leur avis sur l'incohérence dans la documentation.

29
répondu lbalazscs 2017-05-23 12:34:18

@Nonnull et @Nullable sont correctement traités par IntelliJ IDEA. FindBugs a trouvé le problème avec @Nonnull mais a manqué ceux pour @Nullable et @CheckForNUll . Les problèmes qui ont été détectés par IDEA et FindBugs sont marqués par des commentaires.

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
répondu Alexander Pavlov 2012-09-17 07:46:06

dans L'idée IntelliJ @javax.annotation.Nullable est supporté par défaut et toute tentative de déréférence @Nullable arguments ou valeurs de retour résultera en avertissement.

@alexander-pavlov, vous pouvez ajouter @javax.annotation.CheckForNull en configuration d'inspection" conditions constantes et exceptions". Aller Fichier - > Paramètres - > Inspections - > bogues probables->conditions constantes et exceptions - >annotations de configuration.

je préfère faire comme @CheckForNull a plus clair Signification de @Nullable comme @lbalazscs mentionné dans sa réponse ci-dessus.

3
répondu Ilya Silvestrov 2012-09-20 09:14:57