Widzę to @Nullablei @Nonnulladnotacje mogą być pomocne w zapobieganiu NullPointerExceptions, ale nie rozprzestrzeniają się zbyt daleko.
- Skuteczność tych adnotacji spada całkowicie po jednym poziomie pośredniej, więc jeśli dodasz tylko kilka, nie będą one rozprzestrzeniać się zbyt daleko.
- Ponieważ te adnotacje nie są dobrze egzekwowane, istnieje niebezpieczeństwo, że wartość oznaczona znakiem
@Nonnullnie jest zerowa, a co za tym idzie, nie będzie przeprowadzać kontroli zerowej.
Poniższy kod powoduje, że parametr oznaczony symbolem @Nonnulljest nullbez zgłaszania zastrzeżeń. Rzuca, NullPointerExceptiongdy jest uruchomiony.
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
}
}
Czy istnieje sposób na bardziej rygorystyczne egzekwowanie i / lub dalsze rozpowszechnianie tych adnotacji?
@Nonnullpodczas wywoływania @Nonnullmetody ze zmienną dopuszczającą wartość null. Oczywiście rzutowanie z adnotacją nie jest możliwe w Javie 7, ale Java 8 będzie dodawać możliwość stosowania adnotacji do użycia zmiennej, w tym rzutowania. Więc może to stać się możliwe do zaimplementowania w Javie 8.
(@NonNull Integer) yjest syntaktycznie możliwe, ale kompilator nie może emitować żadnego określonego kodu bajtowego na podstawie adnotacji. W przypadku asercji w czasie wykonywania wystarczające są małe metody pomocnicze, omówione w bugs.eclipse.org/442103 (np. directPathToA(assertNonNull(y))) - ale pamiętaj, to tylko pomaga szybko zawieść. Jedynym bezpiecznym sposobem jest wykonanie rzeczywistego sprawdzenia wartości null (oraz, miejmy nadzieję, alternatywnej implementacji w gałęzi else).
@Nonnullio @Nullablektórej mówisz, ponieważ istnieje wiele podobnych adnotacji (patrz to pytanie ). Czy mówisz o adnotacjach w pakiecie javax.annotation?

@Nullablelub@Nonnull, ale jeśli są tego warte, jest bardzo „prawdopodobne, że zachęcą do debaty”