web-dev-qa-db-fra.com

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 de JSR-305/FindBugs: http://findbugs.sourceforge.net/manual/annotations .html

41
vitaly

Je pense que c'est assez clair d'après le lien que vous avez ajouté: si vous utilisez @CheckForNull et le code qui utilise la valeur ne vérifie pas null, FindBugs l'affichera comme une erreur.

FindBugs ignorera @Nullable.

En pratique, cette annotation n'est utile que pour remplacer une annotation globale NonNull.

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

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

31
lbalazscs

@Nonnull et @Nullable sont correctement gérés par IntelliJ IDEA. FindBugs a trouvé le problème avec @Nonnull mais j'ai raté ceux pour @Nullable et @CheckForNUll. Les problèmes détectés par IDEA et FindBugs sont signalés par des commentaires.

package com.db.icestation;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public class test {

    @Nullable public String nullable() {
        return "";
    }

    @Nonnull public String nonnull() {
        return null; // IDEA, findbugs
    }

    @CheckForNull public 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
Alexander Pavlov

Dans l'idée IntelliJ @javax.annotation.Nullable est pris en charge par défaut et toute tentative de déréférencement @Nullable les arguments ou les valeurs de retour entraîneront un avertissement.

@ alexander-pavlov, vous pouvez ajouter @javax.annotation.CheckForNull dans la configuration de l'inspection "Conditions constantes et exceptions". Allez Fichier-> Paramètres-> Inspections-> Bogues probables-> Conditions constantes et exceptions-> Configurer les annotations.

Je préfère faire ça comme @CheckForNull a une signification plus claire que @Nullable comme @lbalazscs mentionné dans sa réponse ci-dessus.

3
Ilya Silvestrov