Eu posso ver que @Nullablee @Nonnullanotações pode ser útil na prevenção NullPointerExceptions, 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
@Nonnullnão é nulo e, consequentemente, não executa verificações nulas.
O código abaixo faz com que um parâmetro marcado com @Nonnullseja nullsem apresentar nenhuma reclamação. Ele lança um NullPointerExceptionquando é 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?
@Nonnullchamar um @Nonnullmé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).
@Nonnulle @Nullableque você está falando, pois há vários annoations semelhantes (Veja esta pergunta ). Você está falando sobre as anotações no pacote javax.annotation?

@Nullableou@Nonnull, mas se eles valem a pena é muito "provável que debate solicit"