sábado, 3 de marzo de 2012

Aseveraciones (Assertions) en Java

votar
   Hace algunas entradas, estuvimos viendo el manejo de excepciones en Java. Hoy vamos a tratar de un tema relacionado: el uso de assert, o aseveraciones, en Java.

   Las aseveraciones te permiten comprobar las presunciones que haces sobre tu código mientras lo estás desarrollando, sin tener que manejar excepciones que tú crees que nunca, nunca, ocurrirán.

   Supongamos que escribes un código según el cual si x>0, sucede una cosa, y si x==0, sucede otra. Podríamos expresarlo así:

if(x>0){
  //código
}else{
  //más código
}
Tú supones que nunca, jamás de los jamases x<0; pero, ¿y si algo va mal y resulta que x tiene un valor negativo?. En este caso, se ejecutaría la parte de código correspondiente a else, como si x==0, con resultados impredecibles.
Para evitarlo, podemos usar una aseveración:


if(x>0)
  //código
}else{
  assert(x==0);
   //Ejecutar este código a menos que x sea negativo
}

De esta forma, si tu aseveración es cierta, el código continua ejecutándose normalmente. Pero si resulta ser falsa, se lanza un AssertionError que para el programa. Este AssertionError nunca debe manejarse.

A pesar de su utilidad durante el proceso de depuración, las aseveraciones no son tan utiliazadas por los desarrolladores como debieran. Por supuesto, esto no significa que debas lanzarte a escribir aseveraciones en tu código a diestro y siniestro. Deben ser usadas sobre todo para comprobar errores de lógica, y siempre en bloques de código sobre los que tengas un control total.

Esto es así porque las aseveraciones pueden ser habilitadas o inhabilitadas durante la ejecución. Si escribes una aseveración en un método público, ese método puede ser utilizado más adelante en condiciones desconocidas para ti. Por este mismo motivo, una aseveración nunca, nunca, nunca, puede afectar al desarrollo de un programa, porque imagínate qué ocurriría si del resultado de una aseveración dependiera una acción, pero quien utiliza el programa tiene inhabilitadas las aseveraciones.

Normalmente, las aseveraciones se habilitan mientras se depura el código, y después se vuelven a inhabilitar, y para el JVM es como si no existiesen. Pero si alguna vez el programa o la aplicación se comportan de forma extraña, pueden volver a habilitarse para ver qué es lo que ocurre.


Hay dos tipos de aseveraciones:
  • assert expresión;
  • assert expresión1: expresión2;
La única diferencia es que en el segundo tipo, además de lanzar un AssertionError, puedes añadir una frase que especifique el error. Por ejemplo, en el caso anterior podríamos haber escrito:

assert(x==0): "x es negativo";

Para habilitar o inhabilitar las aseveraciones se utiliza la línea de comandos:
  • java -ea o java -enableassertions para habilitarlas
  • java -da o java -disableassertions para inhabilitarlas
Si no se le añaden argumentos, se aplican a todas las aseveraciones de todas las clases, pero se puede especificar, de forma que sólo afecten a un paquete, a una clase... Por ejemplo:

java -ea:com.ejemplo.Test sólo habilita a las de la clase Test del paquete ejemplo.
java -ea -da:com.ejemplo.Test habilita a todas excepto a las de la clase Test del paquete ejemplo.
java -ea -da:com.ejemplo...habilita a todas excepto a las del paquete ejemplo y sus subpaquetes.

Por último, una advertencia, assert sólo está disponible a partir de Java 1.4 Si tu versión es más antigua, ya estás tardando en actualizarte.(¿Cómo puedes sobrevivir en la prehistoria?).

Para más información sobre el tema, podéis ir a docs.oracle.com o leer los libros Just Java de Joshua Linden y SCJP Sun Certified Programmer for Java 6 de Kathy Sierra y Bert Bates.

No hay comentarios:

Publicar un comentario en la entrada