Acabo de comenzar a usar la @NotNull
anotación con Java 8 y obtener algunos resultados inesperados.
Tengo un método como este:
public List<Found> findStuff(@NotNull List<Searching> searchingList) {
... code here ...
}
Escribí una prueba JUnit pasando el valor nulo para el argumento searchList. Esperaba que ocurriera algún tipo de error, pero sucedió como si la anotación no estuviera allí. ¿Es este comportamiento esperado? Por lo que entendí, esto fue para permitirle omitir la escritura del código de verificación nulo repetitivo.
Una explicación de lo que se supone que debe hacer exactamente @NotNull sería muy apreciada.
@NotNull
Es solo una anotación. Las anotaciones no hacen nada por sí mismas. Necesitan un procesador de anotaciones en tiempo de compilación, o algo que lo procese en tiempo de ejecución.Respuestas:
@Nullable
y@NotNull
no hacer nada por su cuenta. Se supone que actúan como herramientas de documentación.La
@Nullable
anotación le recuerda la necesidad de introducir una verificación NPE cuando:La
@NotNull
Anotación es, en realidad, un contrato explícito que declara lo siguiente:no puedeno debe llevar a cabo valor nulo.Por ejemplo, en lugar de escribir:
Puedes usar:
Además, a
@NotNull
menudo es verificado por Validadores de restricción (por ejemplo, en primavera e hibernación).La
@NotNull
anotación no realiza ninguna validación por sí sola porque la definición de la anotación no proporciona ningunaConstraintValidator
referencia de tipo.Para más información ver:
fuente
Optional
podría usarse en lugar de@Null
valores de retorno y sobrecarga de métodos en lugar de@Null
en listas de parámetros: dolszewski.com/java/java-8-optional-use-cases* The annotated element must not be {@code null}. * Accepts any type.
y creo que la palabra debe reemplazarse con debería pero nuevamente depende de cómo la leas. Definitivamente, sería bueno tener algunas aclaraciones másnull
pero se permitiría, está usando la anotación incorrecta. El término no implica que esté validado. Sin embargo, una pista de que no está validado no estaría de más. Si desea agregar validación automática, puede usar algunas herramientas externas. Por ejemplo, el IDE IntelliJ tiene soporte incorporado para inyectar cheques nulos.Como se mencionó anteriormente
@NotNull
, no hace nada por sí solo. Una buena forma de usarlo@NotNull
sería usarlo conObjects.requireNonNull
fuente
this.bar = Objects.requireNonNull(bar, "bar must not be null");
Para hacer
@NotNull
activarlo necesitas Lombok:https://projectlombok.org/features/NonNull
Siga: ¿Qué anotación Java @NotNull debería usar?
fuente
SO @NotNull solo es una etiqueta ... Si desea validarlo, debe usar algo como hibernate validator jsr 303
fuente
Si está utilizando Spring, puede forzar la validación anotando la clase con
@Validated
:Más información disponible aquí: validación Javax @NotNull uso de anotaciones
fuente
Hago esto para crear mi propia anotación de validación y validador:
ValidCardType.java
(anotación para poner en métodos / campos)Y, el validador para activar la verificación
CardTypeValidator.java
:Puedes hacer algo muy similar a comprobar
@NotNull
.fuente
Para probar la validación de su método en una prueba, debe envolverlo como proxy en el método @Before.
Con MethodValidationProxyFactory como:
}
Y luego, agregue su prueba:
fuente