Comecei a usar a @NotNull
anotação com Java 8 e a obter resultados inesperados.
Eu tenho um método como este:
public List<Found> findStuff(@NotNull List<Searching> searchingList) {
... code here ...
}
Eu escrevi um teste JUnit passando o valor nulo para o argumento searchList. Eu esperava que algum tipo de erro acontecesse, mas ocorreu como se a anotação não estivesse lá. Esse comportamento é esperado? Pelo que entendi, isso foi para permitir que você pule a gravação do código de verificação nulo padrão.
Uma explicação do que exatamente o @NotNull deveria fazer seria muito apreciada.
@NotNull
é apenas uma anotação. As anotações não fazem nada por si mesmas. Eles precisam de um processador de anotação no momento da compilação ou de algo que o processe no tempo de execução.Respostas:
@Nullable
e@NotNull
não fazem nada por conta própria. Eles devem atuar como ferramentas de documentação.A
@Nullable
anotação lembra você sobre a necessidade de introduzir uma verificação NPE quando:A
@NotNull
anotação é, na verdade, um contrato explícito que declara o seguinte:não podenão deve ter valor nulo.Por exemplo, em vez de escrever:
Você pode usar:
Além disso,
@NotNull
geralmente é verificado pelos ConstraintValidators (por exemplo, na primavera e no hibernar).A
@NotNull
anotação não faz nenhuma validação por si só porque a definição da anotação não fornece nenhumaConstraintValidator
referência de tipo.Para mais informações, consulte:
fonte
Optional
pode ser usado no lugar de@Null
em valores de retorno, e método de sobrecarga no lugar de@Null
em listas de parâmetros: dolszewski.com/java/java-8-optional-use-cases* The annotated element must not be {@code null}. * Accepts any type.
e acho que a palavra deve ser substituída por should, mas novamente depende de como você a lê. Definitivamente, seria bom ter mais esclarecimentos #null
mas seria permitido, está usando a anotação incorreta. O termo não implica que seja validado. No entanto, uma dica de que não é validada não faria mal. Se você deseja adicionar a validação automática, pode usar algumas ferramentas externas. Por exemplo, o IntelliJ IDE possui suporte interno para injetar verificações nulas.Como mencionado acima
@NotNull
, nada faz por si só. Uma boa maneira de usar@NotNull
seria usá-lo comObjects.requireNonNull
fonte
this.bar = Objects.requireNonNull(bar, "bar must not be null");
Para
@NotNull
ativar você precisa do Lombok:https://projectlombok.org/features/NonNull
Siga: Qual anotação @NotNull Java devo usar?
fonte
SO @NotNull é apenas uma tag ... Se você deseja validá-lo, deve usar algo como o hibernate validator jsr 303
fonte
Se você estiver usando o Spring, poderá forçar a validação anotando a classe com
@Validated
:Mais informações disponíveis aqui: Validação Javax @NotNull uso da anotação
fonte
Eu faço isso para criar minha própria anotação e validador de validação:
ValidCardType.java
(anotação para colocar em métodos / campos)E, o validador para acionar a verificação
CardTypeValidator.java
:Você pode fazer algo muito semelhante para verificar
@NotNull
.fonte
Para testar sua validação de método em um teste, você deve agrupar um proxy no método @Before.
Com MethodValidationProxyFactory como:
}
E então, adicione seu teste:
fonte