Eu posso ver que @Nullable
e @Nonnull
anotações pode ser útil na prevenção NullPointerException
s, mas eles não se propagam muito longe.
- A eficácia dessas anotações diminui completamente após um nível de indireção, portanto, se você adicionar apenas algumas, elas não se propagam muito longe.
- Como essas anotações não são bem aplicadas, existe o risco de assumir que um valor marcado com
@Nonnull
não é nulo e, consequentemente, não executa verificações nulas.
O código abaixo faz com que um parâmetro marcado com @Nonnull
seja null
sem apresentar nenhuma reclamação. Ele lança um NullPointerException
quando é executado.
public class Clazz {
public static void main(String[] args){
Clazz clazz = new Clazz();
// this line raises a complaint with the IDE (IntelliJ 11)
clazz.directPathToA(null);
// this line does not
clazz.indirectPathToA(null);
}
public void indirectPathToA(Integer y){
directPathToA(y);
}
public void directPathToA(@Nonnull Integer x){
x.toString(); // do stuff to x
}
}
Existe uma maneira de tornar essas anotações mais rigorosamente aplicadas e / ou propagar mais?
@Nonnull
chamar um @Nonnull
método com uma variável anulável. Obviamente, a conversão com uma anotação não é possível no Java 7, mas o Java 8 adicionará a capacidade de aplicar anotações ao uso de uma variável, incluindo projeções. Portanto, este pode tornar-se possível implementar em Java 8.
(@NonNull Integer) y
é sintaticamente possível, mas um compilador não tem permissão para emitir nenhum código de byte específico com base na anotação. Para asserções de tempo de execução, pequenos métodos auxiliares são suficientes, conforme discutido em bugs.eclipse.org/442103 (por exemplo, directPathToA(assertNonNull(y))
) - mas lembre-se, isso só ajuda a falhar rapidamente. A única maneira segura é executar uma verificação nula real (além de, esperançosamente, uma implementação alternativa no ramo else).
@Nonnull
e @Nullable
que você está falando, pois há vários annoations semelhantes (Veja esta pergunta ). Você está falando sobre as anotações no pacote javax.annotation
?
@Nullable
ou@Nonnull
, mas se eles valem a pena é muito "provável que debate solicit"