Aserciones de Java
Afirmaciones Java
En este tutorial, aprenderemos sobre la declaración de afirmación de Java (aserciones de Java) con la ayuda de ejemplos.
Las aserciones en Java ayudan a detectar errores al probar el código que asumimos que es verdadero.
Una aserción se hace usando el assert
palabra clave.
Su sintaxis es:
assert condition;
Aquí, condition
es una expresión booleana que asumimos como verdadera cuando se ejecuta el programa.
Habilitación de aserciones
De forma predeterminada, las aserciones están deshabilitadas e ignoradas en tiempo de ejecución.
Para habilitar aserciones, usamos:
java -ea:arguments
O
java -enableassertions:arguments
Cuando las aserciones están habilitadas y la condición es true
, el programa se ejecuta normalmente.
Pero si la condición se evalúa como false
mientras las aserciones están habilitadas, JVM lanza un AssertionError
y el programa se detiene inmediatamente.
Ejemplo 1:aserción de Java
class Main {
public static void main(String args[]) {
String[] weekends = {"Friday", "Saturday", "Sunday"};
assert weekends.length == 2;
System.out.println("There are " + weekends.length + " weekends in a week");
}
}
Salida
There are 3 weekends in a week
Obtenemos el resultado anterior porque este programa no tiene errores de compilación y, de forma predeterminada, las aserciones están deshabilitadas.
Después de habilitar las aserciones, obtenemos el siguiente resultado:
Exception in thread "main" java.lang.AssertionError
Otra forma de declaración de afirmación
assert condition : expression;
En esta forma de declaración de afirmación, se pasa una expresión al constructor del AssertionError
objeto. Esta expresión tiene un valor que se muestra como mensaje de detalle del error si la condición es false
.
El mensaje detallado se utiliza para capturar y transmitir la información del error de afirmación para ayudar a depurar el problema.
Ejemplo 2:aserción de Java con ejemplo de expresión
class Main {
public static void main(String args[]) {
String[] weekends = {"Friday", "Saturday", "Sunday"};
assert weekends.length==2 : "There are only 2 weekends in a week";
System.out.println("There are " + weekends.length + " weekends in a week");
}
}
Salida
Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week
Como vemos en el ejemplo anterior, la expresión se pasa al constructor del AssertionError
objeto. Si nuestra suposición es false
y las aserciones están habilitadas, se lanza una excepción con un mensaje apropiado.
Este mensaje ayuda a diagnosticar y corregir el error que provocó el fallo de la afirmación.
Habilitación de aserción para clases y paquetes específicos
Si no proporcionamos ningún argumento a los modificadores de la línea de comandos de aserción,
java -ea
Esto habilita aserciones en todas las clases excepto en las clases del sistema.
También podemos habilitar la aserción para clases y paquetes específicos usando argumentos. Los argumentos que se pueden proporcionar a estos modificadores de línea de comandos son:
Habilitar aserción en nombres de clases
Para habilitar la aserción para todas las clases de nuestro programa Main,
java -ea Main
Para habilitar solo una clase,
java -ea:AnimalClass Main
Esto habilita la aserción solo en el AnimalClass
en el Main
programa.
Habilitar aserción en nombres de paquetes
Para habilitar aserciones para el paquete com.animal
y sus subpaquetes solamente,
java -ea:com.animal... Main
Habilitar aserción en paquetes sin nombre
Para habilitar la aserción en paquetes sin nombre (cuando no usamos una declaración de paquete) en el directorio de trabajo actual.
java -ea:... Main
Habilitar aserción en clases del sistema
Para habilitar la aserción en las clases del sistema, usamos un modificador de línea de comando diferente:
java -esa:arguments
O
java -enablesystemassertions:arguments
Los argumentos que se pueden proporcionar a estos conmutadores son los mismos.
Deshabilitar aserciones
Para deshabilitar aserciones, usamos:
java -da arguments
O
java -disableassertions arguments
Para deshabilitar la aserción en las clases del sistema, usamos:
java -dsa:arguments
O
java -disablesystemassertions:arguments
Los argumentos que se pueden pasar al deshabilitar aserciones son los mismos que al habilitarlas.
Ventajas de la afirmación
- Rápido y eficiente para detectar y corregir errores.
- Las comprobaciones de afirmación se realizan solo durante el desarrollo y las pruebas. Se eliminan automáticamente en el código de producción en tiempo de ejecución para que no ralentice la ejecución del programa.
- Ayuda a eliminar el código repetitivo y hace que el código sea más legible.
- Refactoriza y optimiza el código con mayor confianza de que funciona correctamente.
Cuándo usar aserciones
1. Códigos inalcanzables
Los códigos inalcanzables son códigos que no se ejecutan cuando intentamos ejecutar el programa. Utilice aserciones para asegurarse de que los códigos inalcanzables sean realmente inalcanzables.
Tomemos un ejemplo.
void unreachableCodeMethod() {
System.out.println("Reachable code");
return;
// Unreachable code
System.out.println("Unreachable code");
assert false;
}
Tomemos otro ejemplo de una declaración de cambio sin un caso predeterminado.
switch (dayOfWeek) {
case "Sunday":
System.out.println("It’s Sunday!");
break;
case "Monday":
System.out.println("It’s Monday!");
break;
case "Tuesday":
System.out.println("It’s Tuesday!");
break;
case "Wednesday":
System.out.println("It’s Wednesday!");
break;
case "Thursday":
System.out.println("It’s Thursday!");
break;
case "Friday":
System.out.println("It’s Friday!");
break;
case "Saturday":
System.out.println("It’s Saturday!");
break;
}
La declaración de cambio anterior indica que los días de la semana pueden ser solo uno de los 7 valores anteriores. No tener un caso predeterminado significa que el programador cree que uno de estos casos siempre se ejecutará.
Sin embargo, puede haber algunos casos que aún no se hayan considerado en los que la suposición sea realmente falsa.
Esta suposición debe verificarse mediante una aserción para asegurarse de que no se alcance el caso de cambio predeterminado.
default:
assert false: dayofWeek + " is invalid day";
Si día de la semana tiene un valor diferente a los días válidos, un AssertionError
es arrojado.
2. Documentación de supuestos
Para documentar sus suposiciones subyacentes, muchos programadores usan comentarios. Tomemos un ejemplo.
if (i % 2 == 0) {
...
} else { // We know (i % 2 == 1)
...
}
Utilice aserciones en su lugar.
Los comentarios pueden quedar desactualizados y desincronizados a medida que crece el programa. Sin embargo, nos veremos obligados a actualizar el assert
declaraciones; de lo contrario, también podrían fallar para condiciones válidas.
if (i % 2 == 0) {
...
} else {
assert i % 2 == 1 : i;
...
}
Cuándo no usar aserciones
1. Comprobación de argumentos en métodos públicos
El usuario puede proporcionar argumentos en métodos públicos.
Entonces, si se usa una aserción para verificar estos argumentos, las condiciones pueden fallar y dar como resultado AssertionError
.
En lugar de usar aserciones, deje que resulte en las excepciones de tiempo de ejecución apropiadas y maneje estas excepciones.
2. Para evaluar expresiones que afectan el funcionamiento del programa
No llame a métodos ni evalúe excepciones que luego puedan afectar la operación del programa en condiciones de aserción.
Tomemos un ejemplo de una lista días de la semana que contiene los nombres de todos los días de una semana.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
assert weekdays.removeAll(weekends);
Aquí, estamos tratando de eliminar elementos Saturday
y Sunday
de ArrayList días de la semana .
Si la aserción está habilitada, el programa funciona bien. Sin embargo, si las aserciones están deshabilitadas, los elementos de la lista no se eliminan. Esto puede resultar en una falla del programa.
En su lugar, asigne el resultado a una variable y luego use esa variable para la afirmación.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
boolean weekendsRemoved = weekdays.removeAll(weekends);
assert weekendsRemoved;
De esta forma, podemos asegurar que todos los fines de semana se eliminan de los días de la semana independientemente de que la afirmación esté habilitada o deshabilitada. Como resultado, no afecta el funcionamiento del programa en el futuro.
Java