@ Uso de anotação anulável

347

Eu vi algum método em java declarado como:

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

Qual o significado @Nullabledaqui? Isso significa que a entrada poderia ser null?

Sem a anotação, a entrada ainda pode ser nula, então acho que não é só isso?

user1508893
fonte
3
Das respostas abaixo, aprendi que a anotação indica que valores nulos são aceitáveis, exemplos de onde é usado, analisadores de código que posso experimentar e que as interpretações podem variar. Veja por que esse formato é bom? Marcam com +1 o tempo todo, especialmente por fazer esta pergunta.
icedwater
8
Qual biblioteca está fornecendo @Nullableno contexto da sua pergunta? É Checker?
precisa saber é o seguinte

Respostas:

367

Torna claro que o método aceita valores nulos e que, se você substituir o método, também deverá aceitar valores nulos.

Também serve como uma dica para analisadores de código como o FindBugs . Por exemplo, se esse método derreferenciar seu argumento sem verificar primeiro o nulo, FindBugs emitirá um aviso.

JB Nizet
fonte
82

Essa anotação é comumente usada para eliminar NullPointerExceptions. @Nullablediz que esse parâmetro pode ser null. Um bom exemplo desse comportamento pode ser encontrado no Google Guice . Nesta estrutura de injeção de dependência leve, você pode dizer que essa dependência pode ser null. Se você tentasse passarnull sem uma anotação, a estrutura se recusaria a fazer seu trabalho.

O que é mais @Nullablepode ser usado com @NotNullanotação. Aqui você pode encontrar algumas dicas sobre como usá-las corretamente. A inspeção de código no IntelliJ verifica as anotações e ajuda a depurar o código.

Adam Sznajder
fonte
1

É verdade que, no meu mundo, há definitivamente pensamentos diferentes, não posso impor "Nunca passar um nulo" porque estou lidando com terceiros incontroláveis, como chamadores de API, registros de banco de dados, ex-programadores etc ... por isso sou paranóico e defensivo nas abordagens . Como você está no Java8 ou posterior, existe uma abordagem um pouco mais limpa do que um ifbloco.

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

Você também pode lançar alguma exceção trocando .orElsepara orElseThrow(() -> new Exception("Dont' send a null")).

Se você não quiser usar @Nullable, que não adiciona nada funcionalmente, por que não nomear o parâmetro com mayBe... para que sua intenção seja clara.

Manabu Tokunaga
fonte