Saltar al contenido

Programación con Aserciones en Java Parte 2

En algunos casos, las afirmaciones son el camino a seguir.

Usar afirmaciones en lugar de comentarios

Para propósitos de documentación, intente algo como lo siguiente:

Programación con Aserciones en Java Parte 2
Programación con Aserciones en Java Parte 2
1234567voidprintTotals(){// ...String amountStr =amountToString(amount);// amountStr no debe ser nullSystem.out.println("Amount: "+ amountStr);// ...}

java

Es incluso mejor hacer cumplir esta comprobación cuando se prueba o se ejecuta un programa. Las afirmaciones pueden resaltar errores potenciales:

12345678910voidprintTotals(){// ...String amountStr =amountToString(amount);// amountStr no debe ser nullassert amountStr !=null;System.out.println("Amount: "+ amountStr);// ...}

java

Nunca más confíe en el uso de comentarios y un depurador. ¡Utiliza afirmaciones en su lugar!

Uso de afirmaciones para validar el código inalcanzable

Esto puede ser especialmente útil cuando no quieres que el flujo de ejecución llegue a un determinado punto de tu programa. Como en el siguiente ejemplo, puedes colocar una afirmación en la cláusula por defecto de una sentencia switch para añadir protección extra:

12345678910111213switch(type){case1://...break;case2://...break;case3://...break;default:assertfalse: "Default case reached";}

java

Sin embargo, debe tener en cuenta que un código verdaderamente inalcanzable puede generar un error en tiempo de compilación:

1234567if(interest <0){retorno0;}else{retorno interés;}assertfalse: "Un interés válido debe ser devuelto";// Error de tiempo de compilación

java

Uso de aseveraciones para verificar el resultado de una operación

No piense en afirmaciones de algo que sólo se usa para comprobar los valores de entrada o reforzar el flujo de control. Recuerda que puedes colocar una afirmación en cualquier parte de tu programa.

Una declaración de afirmación comprueba una expresión booleana. Sin embargo, se pueden utilizar métodos para comprobar los resultados de una operación utilizando criterios complejos:

123String defaultPassw =generateDefaultPassword();assertisValidPassword(defaultPassw);

java

Muchos principiantes optan por utilizar declaraciones impresas aquí. Las afirmaciones van un paso más allá al evaluar realmente el código y marcarlo si no cumple con las expectativas.

No tengas miedo de llenar tu código con métodos de afirmación

Cuanto más compruebes tus suposiciones, más seguro estarás de que esas suposiciones están garantizadas al ejecutar tu código.

Aunque algo le parezca obviamente cierto, recuerde que los bichos pueden aparecer en los lugares menos esperados. A veces es difícil ver todas las posibles formas en que una condición puede fallar.

Sí, esto puede inflar su código, pero las ventajas de arreglar los errores antes y el menor tiempo de depuración (el rastro de la pila de un AssertionError) pueden ayudarle a localizar el origen del error.

Y si te preocupa que todas tus afirmaciones perjudiquen tu desempeño, no lo estés .

En primer lugar, la mayoría de las veces, las operaciones de afirmación son comparaciones simples que se habilitan en el desarrollo y se deshabilitan en la producción. Recuerda, son comprobaciones internas para asegurar que las suposiciones de un desarrollador son correctas. No deberían cambiar el comportamiento de la aplicación.

Sin embargo, se puede hacer uso de una optimización del compilador de Java colocando todas las declaraciones de afirmación dentro de un bloque if que comprueba si hay un valor final estático falso:

123456789afirmaciones booleanas estáticas finalesActivado =falso;// ...if(assertsEnabled){assert expr1;assert expr2;assert expr3;}

java

Esto eliminará el bloque if del archivo de clase generado porque el compilador es lo suficientemente inteligente como para ver que nunca se ejecutará. Puedes ver la explicación de esta forma de compilación condicional al final de esta sección de la Especificación del Lenguaje Java.

Para una mirada más profunda a los efectos de las aseveraciones en el desempeño, mira algunos de los mensajes en este hilo de StackOverflow.