Hola, hallamos la respuesta a tu interrogante, deslízate y la obtendrás un poco más abajo.
Solución:
No significa nada en particular en referencia a Java.
Una invariante de clase es simplemente una propiedad que se cumple para todas las instancias de una clase, siempre, sin importar lo que haga el otro código.
Por ejemplo,
class X
final Y y = new Y();
X tiene la clase invariante de que hay un y
propiedad y nunca es null
y tiene un valor de tipo Y
.
class Counter
private int x;
public int count() return x++;
Esto no logra mantener dos invariantes importantes:
- Que
count
nunca devuelve un valor negativo debido a un posible subdesbordamiento. - que llama a
count
son estrictamente monótonamente crecientes.
La clase modificada conserva esos dos invariantes.
class Counter
private int x;
public synchronized int count()
if (x == Integer.MAX_VALUE) throw new IllegalStateException();
return x++;
…pero falla en preservar la invariante que llama a count
siempre tiene éxito normalmente (ausente TCB-violaciones†) porque count
podría lanzar una excepción o podría bloquearse si un subproceso interbloqueado posee el monitor del contador.
Cada idioma con clases facilita el mantenimiento de algunos invariantes de clase pero no de otros. Java no es una excepción:
- Las clases de Java tienen o no propiedades y métodos de manera constante, por lo que las invariantes de la interfaz son fáciles de mantener.
- Las clases de Java pueden proteger sus
private
campos, por lo que los invariantes que se basan en 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 haya código que viole una invariante al crear una subclase maliciosa.
- Java permite
null
valores para colarse de muchas maneras, por lo que es difícil mantener invariantes “tiene un valor real”. - Java tiene subprocesos, lo que significa que las clases que no se sincronizan tienen problemas para mantener invariantes que se basan en operaciones secuenciales en un subproceso que suceden juntas.
- Java tiene excepciones que facilitan el mantenimiento de invariantes como “devuelve un resultado con la propiedad p o no devuelve ningún resultado”, pero es más difícil mantener invariantes como “siempre devuelve un resultado”.
† – Un exterioridad o violación TCB es un evento que un diseñador de sistemas asume con optimismo que no sucederá.
Por lo general, solo confiamos en que el hardware básico funciona como se anuncia cuando hablamos de las propiedades de los lenguajes de alto nivel construidos sobre ellos, y nuestros argumentos de que las invariantes son válidas no tienen en cuenta la posibilidad de:
- Un programador que usa ganchos de depuración para alterar las variables locales mientras un programa se ejecuta en formas que el código no puede.
- Tus compañeros no usan la reflexión con
setAccessible
Modificarprivate
tablas de búsqueda. - Loki altera la física haciendo que tu procesador compare incorrectamente dos números.
Para algunos sistemas, nuestro TCB puede incluir solo partes del sistema, por lo que no podemos asumir que
- Un administrador o demonio privilegiado no matará nuestro proceso JVM,
… pero podemos suponer que:
- Podemos controlar un sistema de archivos transaccional confiable.
Cuanto más alto es un sistema, más grande suele ser su TCB, pero cuantas menos cosas confiables pueda obtener de su TCB, más probable es que sus invariantes se mantengan y más confiable será su sistema a largo plazo.
Invariante significa algo que debe apegarse a sus condiciones sin importar los cambios o quien lo use/transforme. Es decir, una propiedad de una clase siempre cumple o satisface alguna condición aún después de pasar por transformaciones usando métodos públicos. Por lo tanto, el cliente o usuario de esta clase tiene la seguridad de la clase y su propiedad.
Por ejemplo,
- La condición en el argumento de una función es que siempre debe ser > 0 (mayor que cero) o no debe ser null.
- La propiedad Minimal_account_balance de una clase de cuenta establece que no puede ser inferior a 100. Por lo tanto, todas las funciones públicas deben respetar esta condición y garantizar que la clase sea invariable.
- Dependencia basada en reglas entre variables, es decir, el valor de una variable depende de otra, por lo que si una cambia, usando alguna regla fija, la otra también debe cambiar. Esta relación entre 2 variables debe ser preservada. Si no es así, se viola el invariante.
Son hechos que deben ser true sobre una clase de instancia. Por ejemplo, si una clase tiene una propiedad X y el invariante puede ser X debe ser mayor que 0. Que yo sepa, no existe un método integrado para mantener los invariantes, debe hacer que las propiedades sean privadas y asegurarse de que sus captadores y definidores apliquen la propiedad de invariancia.
Hay anotaciones disponibles que pueden comprobar las propiedades mediante la reflexión y los interceptores. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html
Si sostienes alguna duda y capacidad de renovar nuestro noticia te mencionamos escribir una nota y con mucho gusto lo observaremos.