Puedo ver eso @Nullable
y las @Nonnull
anotaciones pueden ser útiles para prevenir NullPointerException
s pero no se propagan muy lejos.
- La efectividad de estas anotaciones disminuye completamente después de un nivel de indirección, por lo que si solo agrega unas pocas, no se propagan muy lejos.
- Dado que estas anotaciones no se aplican correctamente, existe el peligro de asumir que un valor marcado con
@Nonnull
no es nulo y, en consecuencia, no realiza comprobaciones nulas.
El siguiente código hace que un parámetro marcado con @Nonnull
sea null
sin generar ninguna queja. Lanza un NullPointerException
cuando se ejecuta.
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
}
}
¿Hay alguna manera de hacer que estas anotaciones se apliquen más estrictamente y / o se propaguen más?
@Nonnull
al llamar a un @Nonnull
método con una variable anulable. Por supuesto, la conversión con una anotación no es posible en Java 7, pero Java 8 agregará la capacidad de aplicar anotaciones al uso de una variable, incluidas las conversiones. Entonces, esto puede ser posible implementar en Java 8.
(@NonNull Integer) y
es sintácticamente posible, pero un compilador no puede emitir ningún código de byte específico basado en la anotación. Para las afirmaciones de tiempo de ejecución, los métodos auxiliares pequeños son suficientes como se discutió en bugs.eclipse.org/442103 (por ejemplo, directPathToA(assertNonNull(y))
), pero ten en cuenta que esto solo ayuda a fallar rápidamente. La única forma segura es realizar una comprobación nula real (más, con suerte, una implementación alternativa en la rama else).
@Nonnull
y de @Nullable
qué está hablando, ya que hay múltiples molestias similares (consulte esta pregunta ). ¿Estás hablando de las anotaciones en el paquete javax.annotation
?
@Nullable
o@Nonnull
, pero si valen la pena, es muy "probable que soliciten debate"