Il ne signifie rien de particulier en référence à Java.
Un invariant de classe est simplement une propriété qui s'applique à toutes les instances d'une classe, toujours, quoi que fasse le reste du code.
Par exemple,
class X {
final Y y = new Y();
}
X possède l'invariant de classe qu'il existe un y
et il n'est jamais null
et il a une valeur de type Y
.
class Counter {
private int x;
public int count() { return x++; }
}
Cela ne permet pas de maintenir deux invariants importants :
- Cela
count
ne renvoie jamais une valeur négative en raison d'un éventuel dépassement de capacité.
- Cela appelle à
count
sont strictement monotones et croissants.
La classe modifiée préserve ces deux invariants.
class Counter {
private int x;
public synchronized int count() {
if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
return x++;
}
}
...mais ne préserve pas l'invariant selon lequel les appels à count
réussissent toujours normalement (en l'absence de violations des TCB) † ) car count
peut lever une exception ou se bloquer si un thread bloqué possède le moniteur du compteur.
Chaque langage avec des classes facilite le maintien de certains invariants de classe, mais pas d'autres. Java ne fait pas exception :
- Les classes Java ont ou n'ont pas de propriétés et de méthodes, de sorte que les invariants d'interface sont faciles à maintenir.
- Les classes Java peuvent protéger leurs
private
Les invariants qui reposent sur des données privées sont donc faciles à maintenir.
- Les classes Java peuvent être finales, de sorte que les invariants qui reposent sur l'absence de code violant un invariant en créant une sous-classe malveillante peuvent être maintenus.
- Java permet
null
Il est donc difficile de maintenir les invariants "a une valeur réelle".
- Java dispose de threads, ce qui signifie que les classes qui ne se synchronisent pas ont des difficultés à maintenir les invariants qui reposent sur des opérations séquentielles dans un thread qui se déroulent ensemble.
- Java dispose d'exceptions, ce qui facilite le maintien d'invariants tels que "renvoie un résultat avec la propriété p ou ne renvoie aucun résultat", mais rend plus difficile le maintien d'invariants tels que "renvoie toujours un résultat".
† - An externalité o _TCB violation_ est un événement dont le concepteur du système suppose avec optimisme qu'il ne se produira pas.
Généralement, nous nous contentons de croire que le matériel de base fonctionne comme annoncé lorsque nous parlons des propriétés des langages de haut niveau construits sur ce matériel, et nos arguments selon lesquels les invariants sont valables ne tiennent pas compte de la possibilité de.. :
- Un programmeur qui utilise des crochets de débogage pour modifier les variables locales pendant l'exécution d'un programme d'une manière que le code ne peut pas faire.
- Vos pairs n'utilisent pas la réflexion avec
setAccessible
pour modifier private
les tables de consultation.
- Loki modifie les lois de la physique, ce qui fait que votre processeur compare mal deux nombres.
Pour certains systèmes, notre TCB peut n'inclure que des parties du système, de sorte que nous ne pouvons pas supposer que
- Un administrateur ou un démon privilégié ne tuera pas notre processus JVM,
...mais on peut le supposer :
- Nous pouvons faire un checkpoint vers un système de fichiers transactionnel fiable.
Plus un système est de haut niveau, plus sa TCB est généralement grande, mais plus vous pouvez retirer de choses non fiables de votre TCB, plus vos invariants ont de chances de tenir, et plus votre système sera fiable à long terme.
2 votes
+1 pour la question, car la page Wikipedia donne un très bon exemple de quelque chose que je ne savais pas que l'on pouvait faire - il y a même des exemples. Leur explication est meilleure que ce que je pourrais faire pour vous ; c'est assez simple.
0 votes
stanford.edu/~pgbovine/programming-with-rep-invariants.htm
0 votes
Si vous vous intéressez aux invariants dans le cadre de Java, vous serez peut-être intéressé par le document suivant contrats pour Java .
1 votes
Une explication plus simple - < stackoverflow.com/questions/112064/what-is-an-invariant?rq=1 >