significado invariantes clase java terminology invariants

invariantes - ¿Qué es una clase invariante en Java?



invariantes de clase java (3)

Busqué en Google el tema, pero además de Wikipedia no encontré documentación o artículos útiles.

¿Puede alguien explicarme en palabras simples lo que significa o remitirme a alguna documentación agradable y fácil de entender?


Invariante significa algo que debe ajustarse a sus condiciones, sin importar los cambios o quien lo use / lo transforme. Es decir, una propiedad de una clase siempre cumple o satisface alguna condición incluso después de pasar por transformaciones mediante el uso de métodos públicos. Entonces, el cliente o usuario de esta clase está asegurado sobre la clase y su propiedad.

Por ejemplo,

  1. condición en el argumento de función es que, siempre debe ser> 0 (mayor que cero) o no debe ser nulo.
  2. minimum_account_balance propiedad de una cuenta de estados de clase, no puede ir por debajo de 100. Por lo tanto, todas las funciones públicas deben respetar esta condición y garantizar invariante de clase.
  3. la dependencia basada en reglas entre las variables, es decir, el valor de una variable depende de otra, por lo que si se modifica, usando alguna regla de corrección, otra también debe cambiar. Esta relación entre 2 variables debe ser preservada. Si no lo hace, entonces invariante es violado.

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 la clase invariante de 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++; } }

no puede mantener dos invariantes importantes

  1. Ese count nunca devuelve un valor negativo debido a un posible subdesbordamiento.
  2. Los llamados 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 no se conserva la constante de que las llamadas para count siempre tienen éxito normalmente (ausentes TCB-violaciones ) porque el count puede arrojar una excepción o puede bloquear si un subproceso en punto muerto posee el monitor del contador.

Cada idioma con clases facilita el mantenimiento de algunas invariantes de clase pero no de otras. Java no es una excepción:

  1. Las clases Java tienen consistentemente o no tienen propiedades y métodos, por lo que las invariantes de la interfaz son fáciles de mantener.
  2. Las clases de Java pueden proteger sus campos private , por lo que las invariantes que dependen de datos privados son fáciles de mantener.
  3. 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 creando una subclase maliciosa.
  4. Java permite que null valores null se filtren de muchas maneras, por lo que es difícil mantener invariantes de "valor real".
  5. 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.
  6. Java tiene excepciones que facilitan el mantenimiento de invariantes como "devuelve un resultado con propiedad p o no arroja ningún resultado", pero es más difícil mantener invariantes como "siempre devuelve un resultado".

† - Una violación de externalidad o TCB es un evento que un diseñador de sistemas asume de manera optimista que no sucederá.

Por lo general, confiamos en que el hardware básico funciona según lo anunciado cuando se habla de las propiedades de los lenguajes de alto nivel construidos sobre ellos, y nuestros argumentos que sostienen 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 private tablas de búsqueda private .
  • 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 suponer que

  • Un administrador o daemon con privilegios no matará nuestro proceso de JVM,

pero podemos suponer que

  • Podemos hacer un punto de control a un sistema de archivos transaccional confiable.

Cuanto mayor sea el nivel de un sistema, mayor será su TCB, pero cuanto más poco confiables se puedan obtener de su TCB, más probabilidades tendrá de mantener sus invariantes, y más confiable será su sistema a largo plazo.


Son hechos que deben ser ciertos sobre una clase de instancia. Por ejemplo, si una clase tiene una propiedad X e invariante puede ser X debe ser mayor que 0. Que yo sepa, no hay un método incorporado para mantener invariantes, debe hacer que las propiedades sean privadas y asegurarse de que sus implementadores y ejecutores apliquen la propiedad de invarianza.

Hay anotaciones disponibles que pueden verificar propiedades usando reflexión e interceptores. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html