Java em si não é fornecido com estas anotações.
Em vez disso, há cerca de 10 mutuamente incompatíveis assume a idéia, mais do que trabalhar de forma completamente diferente e aplicar diferentes significados para o que NonNull
significa que, onde você pode colocá-lo, e como ele funciona.
Ausência temporária. Isso é muito lamentável, como a idéia básica da utilização de anotações para adicionar esta informação é muito superior a Opcional e tal, já que seria totalmente compatível e não relegar o código existente para o marasmo da obsolecence, ao contrário de Optional
.
Assim, encontrar um que você gosta, e incluí-lo em seu projeto mesma forma que inclui terceiros de dependência, geralmente incluindo-a no Maven/Gradle/Ant+ivy/etc (o arquivo de compilação da lista de dependências).
Intellij tem sua própria visão sobre o não nulo e Anulável. É, provavelmente, o mais conveniente. Suas idéias sobre o que estas anotações média são inferioresa 1. O verificador de Estrutura é melhor, o eclipse é um distante segundo melhor, e tudo o mais (incluindo o intellij a) ações o terceiro lugar. o melhor é ser encontradas no Verificador de Quadro, ou, quase tão bom, o eclipse de assumir estas anotações. No entanto, eu duvido que o intellij é a verificação de nulidade sistemas são capazes de compreender plenamente o seu mais avançadas de adições, tais como @PolyNull
, então este poder expressivo seria principalmente desperdiçado. Como um bônus, o intellij é fornecido com um monte de dados sobre o que é o direito de nulidade de anotações seria em grandes bibliotecas.
Este último ponto é importante: Mais comumente usado bibliotecas java, incluindo java.*
em si, não tem essas anotações, e trabalhar com meia-nulo-código anotado, definitivamente é altamente frustrante exercício; os custos de fazer o que muito superam os benefícios. A única solução real é "consertar" as bibliotecas que você usa com o direito de nulidade de informações, mas esta é uma tonelada de trabalho. Felizmente, o intellij tem feito muito por você.
Eu esperaria (eclipse faz isso), que o quickfix (CMD+1 em macs, o CTRL+1 no não-macs, pelo menos, fora da caixa, se a minha memória de predefinição atalhos de teclado que me serve) inclui "adicionar automaticamente eclipse nulidade anotações para o classpath" (ou no seu caso, o intellij, claro). Se isso é, de alguma forma, não aparecendo, Esta página a partir do intellij docs explicar exatamente como adicionar o org.jetbrains.annotations
a biblioteca, que contém a sua nulidade anotações, para o seu projecto. Na verdade, esses documentos indicam que, de fato, o quickfix menu oferece-lhe a opção de adicionar automaticamente esta biblioteca como solução para o erro, você recebe em seu @NonNull
o nó em seu código-fonte.
[1] a Maioria leva em nulidade anotações limitar-se consideravelmente, permitindo a anotação apenas em campos, métodos (o que implica: o Que ele retorna), e os parâmetros. No entanto, pode-se ter uma definitivamente-não-null List
de podia-ser-null Map
instâncias, que Mapa é que definitivamente não é nulo String
poderia ser nulo Integer
: @NonNull List<@Nullable Map<@NonNull String, @Nullable Integer>>
. A anotação sistema é capaz de deixar você escrever isso, mas somente se suas notas são configurados exclusivamente para TYPE_USE. o verificador de estrutura e eclipse nulidade anotações assim que funciona; a maioria dos outros não, e, portanto, são menos expressivas. CheckerFramework vai um passo além e permite que você escreva a noção de 'ou a nulidade é bem'. Assim como os genéricos tem 3 formas (List<Integer>
e List<? super Integer>
e List< extends Integer>
, uma vez que os genéricos estão envolvidos, 2 nulidades (nunca nulo, ou definitivamente nulo é permitido) não é mais suficiente, você precisa de mais nulidades. o verificador de quadro @PolyNull
será permite a ligação nulidades: Você pode, por exemplo, escrever esse método em checkerframework mas você não pode, possivelmente, escrever é digitado corretamente com o intellij, ou para que o assunto do eclipse:
public void duplicateFirstMatch(List<T> elems, Predicate<T> matcher);
onde a idéia é: Este método é executado o matcher em relação a cada elemento da lista, e sobre um jogo, esse elemento é adicionado ao final da lista. Esse método pode funcionar se T
é considerado '@não nulo' (dado que não nulos são, null não pode ser adicionado por este código, para que o não-nulidade dos seus elementos não pode ser violada por ele), mas funciona muito bem se T
é @Nullable
, desde o matcher é também de @Nullable T
claro: Agora esse código pode adicionar nulo para a lista, mas tudo bem.
Assim, T
não é Nulo nem não nulo, mas o Ts mencionado na assinatura não precisa corresponder as suas nulidades. @PolyNull
resolve este problema.