Widzę to @Nullable
i @Nonnull
adnotacje mogą być pomocne w zapobieganiu NullPointerException
s, 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
@Nonnull
nie jest zerowa, a co za tym idzie, nie będzie przeprowadzać kontroli zerowej.
Poniższy kod powoduje, że parametr oznaczony symbolem @Nonnull
jest null
bez zgłaszania zastrzeżeń. Rzuca, NullPointerException
gdy 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?
@Nonnull
podczas wywoływania @Nonnull
metody 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) y
jest 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).
@Nonnull
io @Nullable
której mówisz, ponieważ istnieje wiele podobnych adnotacji (patrz to pytanie ). Czy mówisz o adnotacjach w pakiecie javax.annotation
?
@Nullable
lub@Nonnull
, ale jeśli są tego warte, jest bardzo „prawdopodobne, że zachęcą do debaty”