Vedo che @Nullable
e le @Nonnull
annotazioni potrebbero essere utili per prevenire NullPointerException
s ma non si propagano molto lontano.
- L'efficacia di queste annotazioni diminuisce completamente dopo un livello di riferimento indiretto, quindi se ne aggiungi solo alcune non si propagano molto lontano.
- Poiché queste annotazioni non vengono applicate correttamente, esiste il pericolo di presumere che un valore contrassegnato
@Nonnull
non sia null e di conseguenza non eseguire controlli null.
Il codice seguente fa sì che un parametro contrassegnato con @Nonnull
sia null
senza sollevare lamentele. Emette un NullPointerException
quando viene eseguito.
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
}
}
C'è un modo per rendere queste annotazioni più rigorosamente applicate e / o propagare ulteriormente?
@Nonnull
quando si chiama un @Nonnull
metodo con una variabile nullable. Ovviamente, il casting con un'annotazione non è possibile in Java 7, ma Java 8 aggiungerà la possibilità di applicare annotazioni all'uso di una variabile, inclusi i cast. Quindi questo potrebbe diventare possibile implementare in Java 8.
(@NonNull Integer) y
è sintatticamente possibile, ma a un compilatore non è consentito emettere alcun codice byte specifico in base all'annotazione. Per le asserzioni di runtime sono sufficienti piccoli metodi di supporto, come discusso in bugs.eclipse.org/442103 (ad es. directPathToA(assertNonNull(y))
) - ma attenzione, questo aiuta solo a fallire velocemente. L'unico modo sicuro è quello di eseguire un controllo null effettivo (oltre, si spera, un'implementazione alternativa nel ramo else).
@Nonnull
e di @Nullable
cui stai parlando, in quanto vi sono più fastidi simili (Vedi questa domanda ). Stai parlando delle annotazioni nel pacchetto javax.annotation
?
@Nullable
o@Nonnull
, ma se ne valgono la pena è molto "probabile che solleciti il dibattito"