J'ai googlé le sujet, mais à part Wikipedia je n'ai trouvé aucune autre documentation ou article utile.
Quelqu'un peut-il m'expliquer en termes simples ce que cela signifie ou me renvoyer à une documentation agréable et facile à comprendre?
Cela ne signifie rien en particulier en référence à Java.
Un invariant de classe est simplement une propriété qui est valable pour toutes les instances d'une classe, toujours, peu importe ce que fait le code.
Par exemple,
class X {
final Y y = new Y();
}
X a invariant de classe qu'il existe une propriété y
et qu'elle n'est jamais null
et qu'elle a une valeur de type Y
.
class Counter {
private int x;
public int count() { return x++; }
}
ne parvient pas à maintenir deux invariants importants
count
ne renvoie jamais une valeur négative en raison d'un possible débordement.count
augmentent strictement de façon monotone.La classe modifiée conserve ces deux invariants.
class Counter {
private int x;
public synchronized int count() {
if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
return x++;
}
}
mais ne parvient pas à préserver l'invariant qui appelle à count
toujours réussir normalement (violations TCB absentes†) parce que count
peut générer une exception ou se bloquer si un thread bloqué possède le moniteur du compteur.
Chaque langue avec des classes facilite le maintien de certains invariants de classe mais pas d'autres. Java ne fait pas exception:
private
. Les invariants qui reposent sur des données privées sont donc faciles à gérer.null
les valeurs à se faufiler de plusieurs façons. Il est donc difficile de conserver des invariants "a une valeur réelle".† - Une externalité ou TCB violation est un événement qu'un concepteur de systèmes présume avec optimisme ne se produira pas.
En général, nous ne faisons que croire que le matériel de base fonctionne comme annoncé lorsque nous parlons de propriétés de langages de haut niveau construits sur ces langages. Nos arguments pris en charge par les invariants ne prennent pas en compte la possibilité de:
setAccessible
pour modifier les tables de consultation private
.Pour certains systèmes, notre TCB peut ne comprendre que certaines parties du système. Par conséquent, nous ne pouvons pas supposer que
mais on peut supposer que
Plus un système est de niveau supérieur, plus son TCB est grand, mais plus vous pouvez extraire d'éléments peu fiables de votre TCB, plus vos invariants sont susceptibles de tenir, et plus votre système sera fiable à long terme.
Invariant signifie quelque chose qui devrait rester fidèle à ses conditions, quels que soient les changements et ceux qui l'utilisent/le transforment. C'est-à-dire qu'une propriété d'une classe remplit ou satisfait toujours une condition même après avoir subi des transformations en utilisant des méthodes publiques. Ainsi, le client ou l'utilisateur de cette classe est assuré à propos de la classe et de sa propriété.
Par exemple,
Ce sont des faits qui doivent être vrais à propos d'une classe d'instance. Par exemple, si une classe a une propriété X et que l'invariant peut être X, il doit être supérieur à 0. À ma connaissance, il n'existe pas de méthode intégrée pour gérer les invariants. Vous devez donc rendre les propriétés privées et vous assurer que vos accesseurs appliquent la propriété d'invariance.
Des annotations sont disponibles pour vérifier les propriétés à l'aide de la réflexion et des intercepteurs. http://docs.Oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html