No significa nada en particular en referencia a java.
Un invariante de clase es simplemente una propiedad que se mantiene para todas las instancias de una clase, siempre, sin importar lo que haga otro código.
Por ejemplo,
class X {
final Y y = new Y();
}
X tiene el invariante de clase que hay una propiedad y
y nunca es null
y tiene un valor de tipo Y
.
class Counter {
private int x;
public int count() { return x++; }
}
falla para mantener dos invariantes importantes
count
Eso nunca se devuelve un valor negativo debido a la posible desbordamiento.
- Las llamadas a
count
son estrictamente monótonamente cada vez mayores.
La clase modificada conserva esas dos invariantes.
class Counter {
private int x;
public synchronized int count() {
if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
return x++;
}
}
pero no preserva el invariante que llama a count
siempre tienen éxito normalmente ausentes (TCB-violaciónes †) porque count
podría lanzar una excepción o podría bloquear si un hilo estancado posee el monitor del mostrador.
Cada idioma con clases facilita el mantenimiento de algunas invariantes de clase pero no de otras. Java no es una excepción:
- Las clases de Java tienen consistentemente o no tienen propiedades y métodos, por lo que las invariantes de la interfaz son fáciles de mantener.
- Las clases de Java pueden proteger sus campos
private
, por lo que las invariantes que dependen de datos privados son fáciles de mantener.
- Las clases de Java pueden ser definitivas, por lo que se pueden mantener las invariantes que dependen de que no exista ningún código que viole una invariante creando una subclase maliciosa.
- Java permite valores de
null
para infiltrarse de muchas maneras, por lo que es difícil mantener invariantes "con un valor real".
- Java tiene subprocesos, lo que significa que las clases que no se sincronizan tienen problemas para mantener invariantes que dependen de operaciones secuenciales en un hilo que suceden juntas.
- Java tiene excepciones que facilitan el mantenimiento de invariantes como "devuelve un resultado con la propiedad p o no arroja ningún resultado", pero es más difícil mantener invariantes como "siempre devuelve un resultado".
† - Una externalidad o TCB violación es un evento que un diseñador de sistemas asume optimismo no va a ocurrir.
Normalmente acabamos de confiar en que el hardware básico funciona como se anuncia cuando se habla de las propiedades de los lenguajes de alto nivel construidas sobre ellos, y los argumentos que mantienen invariantes no tienen en cuenta la posibilidad de:
- Un programador que utiliza enlaces de depuración para alterar variables locales cuando un programa se ejecuta de forma que el código no puede.
- Sus pares no usan la reflexión con
setAccessible
para modificar las tablas de búsqueda private
.
- Loki altera la física haciendo que su procesador compare incorrectamente dos números.
Para algunos sistemas de nuestra TCB podría incluir sólo las partes del sistema, por lo que podría no suponer que
- Un administrador o un demonio privilegiada no matarán a nuestro proceso de JVM,
pero podemos suponer que
- Podemos hacer un punto de control a un sistema de archivos transaccional confiable.
El más alto nivel de un sistema, mayor es su TCB es típicamente, pero las cosas más confiables que usted puede salir de la TCB, los más probable es que su invariantes la titularidad, y el más fiable su sistema será a la larga.
+1 para la pregunta porque la página de Wikipedia tiene un gran ejemplo de algo que no sabía que podía hacer, incluso tiene ejemplos. Sin embargo, su explicación es mejor de lo que podría hacer por ti; es bastante sencillo. – iandisme
https://www.stanford.edu/~pgbovine/programming-with-rep-invariants.htm –
Si está interesado en invariantes w.r.t. Java, tal vez estaría interesado en [contratos para Java] (http://google-opensource.blogspot.com/2011/02/contracts-for-java.html). –