Taller JML
Taller JML
Taller JML
-- Expresiones de especificación—
Ejemplo de \invariant()
Este es un ejemplo de una clase invariante en el lenguaje de programación Java con Java
Modeling Language . El invariante debe ser verdadero después de que finalice el constructor y en
la entrada y salida de todas las funciones miembro públicas. Las funciones de miembros públicos
deben definir condiciones previas y posteriores para ayudar a garantizar que la clase sea
invariante.
/*@ invariant day >= 1 && day <= 31; @*/ // class invariant
/*@ invariant hour >= 0 && hour <= 23; @*/ //class invariant
/*@
@ requires d >= 1 && d <= 31;
@ requires h >= 0 && h <= 23;
@*/
/*@
@ requires d >= 1 && d <= 31;
@ ensures day == d;
@*/
/*@
@ requires h >= 0 && h <= 23;
@ ensures hour == h;
@*/
Ejemplo de \max()
Es un cuantificador generalizado, Se aplican sobre expresiones numéricas como enteros o
números con coma flotante:
}
}
return (max);
Ejemplo de \type ()
Este operador se puede usar para introducir literales de tipo \TYPE en expresiones. Una expresión
de la forma \type(T), donde T es un nombre de tipo, tiene el tipo \TYPE.
Ejemplo de \typeof(spec-expression)
retorna el tipo de una expresión. Este operador retorna el tipo dinámico1 de una expresión (un valor
del tipo \TYPE). Su argumento puede ser de tipo primitivo. Es análogo en Java a Object.getClass().
Ejemplo \only_captured()
Este operador afirma que la ejecución del método solo capturó referencias de un subconjunto de
los grupos de datos nombrados por los campos dados. Se puede aplicar tanto a campos concretos,
modelos o fantasmas.
Ejemplo \elemtype()
Retorna el tipo de dato de un array Este operador toma un argumento de tipo \TYPE y retorna un
valor de tipo \TYPE. Si el argumento es del tipo array, el resultado es el tipo de ese array, es decir
devuelve el tipo compartido por todos los elementos del array.
Ejemplo old()
Una expresión de la forma \old (Expr) se refiere al valor que tenía la expresión Expr en el estado
previo de un método. Se refiere entonces al valor que tenía la expresión Expr cuando el control
llegó por última vez a la etiqueta de declaración Label.
/**Clausula \old
**Refiere al valor que tenía la expresión Expr en el estado previo de un método.
* En una expresión de la forma \old(Expr , Label) , Label debe ser una
etiqueta definida en el método actual.
*/
//@requires
//@ensures
//@expresión-antigua :: = \old ( expresión-especificación [ , ident ] )
//@ | \pre ( expresión-especificación )0
//@ requires vector !=null && (\forall int i ; 0<=i && i<vector.length;
vector[i] != 0) &&
//@ \elemtype(\typeof(vector)) == \type(int);
//@ ensures (\forall int j; 0 <= j && j < vector.length; vector[ j ] ==
\old(vector[ j ]));
private static int sumaVector(int[] vector){
int i=0, suma=0;
while(i<vector.length){
suma=suma+vector[i];
i++;
}
//vector[0]=0;
return suma;
}
Objetos que fueron asignados solo en post-estado. Este operador afirma que objetos se asignaron
recientemente.
//@ ensures \fresh(\result);
public static Persona crearPersona(int peso, int edad, String nombre, int
pago){
Persona per1 = new Persona(peso, edad, nombre, pago);
return per1;
}
}
class Persona {
Ejemplo 2 de \invariant()
Ejemplo 2 \old()
Ejemplo de \only_accessed()
Unicos datos que debieron ser accesados. Este operador se usa en una postcondición de un
método que especifica que la ejecución del método únicamente lee de un subconjunto de los
grupos de datos nombrados por los campos dados.
Ejemplo de \only_assigned()
Ejecución de método únicamente se asignó a determinadas variables Este operador afirma que la
ejecución del método solo se asigna al subconjunto de los grupos de datos nombrados por los
campos dados.
Ejemplo de \ nonnullelements ()
Este operador se puede utilizar para afirmar que una matriz y sus elementos no son nulos
________________________________________________________________________________
public static void elementosNoNulos () {
ArrayList<String> myArray = new ArrayList<String>();
myArray.add("a");
myArray.add("b");
myArray.add("c");
if (myArray != null) {
System.out.println("NO ES NULO");
}else {
System.out.println("ES NULO");
}