@Nullable utilizzo delle annotazioni


347

Ho visto alcuni metodi in Java dichiarati come:

void foo(@Nullable Object obj)
{ ... }

Qual è il significato di @Nullablequi? Significa che l'input potrebbe essere null?

Senza l'annotazione, l'input può ancora essere nullo, quindi immagino che non sia solo questo?


3
Dalle risposte che seguono, ho appreso che l'annotazione indica che i valori null sono accettabili, esempi di dove viene utilizzato, analizzatori di codice che posso provare e che le interpretazioni possono variare. Vedi perché questo formato è buono? +1 a tutto tondo, soprattutto per questa domanda.
acqua ghiacciata

8
Quale biblioteca fornisce @Nullablenel contesto della tua domanda? È Checker?
8bitjunkie,

Risposte:


367

Indica chiaramente che il metodo accetta valori null e che se si sovrascrive il metodo, è necessario accettare anche valori null.

Serve anche come suggerimento per analizzatori di codice come FindBugs . Ad esempio, se un tale metodo dereferenzia il suo argomento senza prima verificare la presenza di null, FindBugs emetterà un avviso.


82

Questa annotazione viene comunemente utilizzata per eliminare NullPointerExceptions. @Nullabledice che questo parametro potrebbe essere null. Un buon esempio di tale comportamento può essere trovato in Google Guice . In questo quadro di iniezione di dipendenza leggera si può dire che questa dipendenza potrebbe essere null. Se si tenta di passare nullsenza un'annotazione, il framework rifiuta di fare il proprio lavoro.

Inoltre, è @Nullablepossibile utilizzare l' @NotNullannotazione. Qui puoi trovare alcuni consigli su come usarli correttamente. L'ispezione del codice in IntelliJ controlla le annotazioni e aiuta a eseguire il debug del codice.



1

Certo, ci sono sicuramente idee diverse, nel mio mondo, non posso applicare "Never pass a null" perché ho a che fare con terze parti incontrollabili come chiamanti API, record di database, ex programmatori ecc ... quindi sono paranoico e difensivo negli approcci . Dato che sei su Java8 o versione successiva, c'è un approccio un po 'più pulito di un ifblocco.

public String foo(@Nullable String mayBeNothing) {
   return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}

Puoi anche lanciare qualche eccezione lì scambiando .orElsea orElseThrow(() -> new Exception("Dont' send a null")).

Se non vuoi usare @Nullable, che non aggiunge nulla funzionalmente, perché non nominare semplicemente il parametro in mayBe...modo che la tua intenzione sia chiara.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.