Esta es la forma típica de lograr este objetivo:¿Cómo puedo colocar restricciones de validación en los parámetros de entrada de mi método?
public void myContractualMethod(final String x, final Set<String> y) {
if ((x == null) || (x.isEmpty())) {
throw new IllegalArgumentException("x cannot be null or empty");
}
if (y == null) {
throw new IllegalArgumentException("y cannot be null");
}
// Now I can actually start writing purposeful
// code to accomplish the goal of this method
Creo que esta solución es feo. Sus métodos se llenan rápidamente con un código repetitivo que verifica el contrato válido de parámetros de entrada, oscureciendo el núcleo del método.
Aquí es lo que me gustaría tener:
public void myContractualMethod(@NotNull @NotEmpty final String x, @NotNull final Set<String> y) {
// Now I have a clean method body that isn't obscured by
// contract checking
Si esas anotaciones se ven como JSR 303/Bean Validation Spec, es porque ellos prestado. Desafortunadamente, no parecen funcionar de esta manera; están destinados a anotar variables de instancia, y luego ejecutar el objeto a través de un validador.
¿Cuál de las many Java design-by-contract frameworks proporciona la funcionalidad más cercana a mi ejemplo de "me gustaría tener"? Las excepciones que se lanzan deben ser excepciones de tiempo de ejecución (como IllegalArgumentExceptions) para que la encapsulación no se rompa.
Preconditions.checkArgument (! X.isEmpty()). –
Aha, siempre es útil para que el creador de la biblioteca a la mano :) –