Ich habe das Thema gegoogelt, aber außer Wikipedia habe ich keine weiteren nützlichen Dokumentationen oder Artikel gefunden.
Kann mir jemand in einfachen Worten erklären, was es bedeutet, oder mich auf eine nette und leicht verständliche Dokumentation verweisen?
java
terminology
invariants
Saurabh Kumar
quelle
quelle
Antworten:
Es bedeutet nichts Besonderes in Bezug auf Java.
Eine Klasseninvariante ist einfach eine Eigenschaft, die für alle Instanzen einer Klasse immer gilt, unabhängig davon, was anderer Code tut.
Beispielsweise,
X hat die Klasseninvariante, dass es eine
y
Eigenschaft gibt und es ist nienull
und es hat einen Wert vom TypY
.kann zwei wichtige Invarianten nicht beibehalten
count
gibt aufgrund eines möglichen Unterlaufs niemals einen negativen Wert zurück.count
streng monoton zu.Die modifizierte Klasse behält diese beiden Invarianten bei.
Die Invariante, die aufgerufen wird, um
count
immer normal erfolgreich zu sein (ohne TCB-Verstöße † ) , bleibt jedoch nicht erhalten, dacount
möglicherweise eine Ausnahme ausgelöst oder blockiert wird, wenn ein blockierter Thread den Monitor des Zählers besitzt.Jede Sprache mit Klassen macht es einfach, einige Klasseninvarianten zu pflegen, andere jedoch nicht. Java ist keine Ausnahme:
private
Felder schützen , sodass Invarianten, die auf privaten Daten basieren, einfach zu pflegen sind.null
Werte auf vielfältige Weise einschleichen, sodass es schwierig ist, Invarianten mit "hat einen echten Wert" beizubehalten.† - Eine Externalität oder TCB- Verletzung ist ein Ereignis, von dem ein Systemdesigner optimistisch annimmt, dass es nicht eintreten wird.
Normalerweise vertrauen wir nur darauf, dass die grundlegende Hardware wie angekündigt funktioniert, wenn wir über Eigenschaften von darauf basierenden Hochsprachen sprechen, und unsere Argumente, die Invarianten vertreten, berücksichtigen nicht die Möglichkeit von:
setAccessible
, umprivate
Nachschlagetabellen zu ändern .Bei einigen Systemen enthält unser TCB möglicherweise nur Teile des Systems, sodass wir dies möglicherweise nicht annehmen
aber wir könnten das annehmen
Je höher ein System ist, desto größer ist normalerweise sein TCB. Je unzuverlässiger Sie jedoch aus Ihrem TCB herausholen können, desto wahrscheinlicher ist es, dass Ihre Invarianten halten, und desto zuverlässiger ist Ihr System auf lange Sicht.
quelle
count
nie zweimal denselben Wert zurückgibt" wirklich als Klasseninvariante betrachtet?Invariante bedeutet etwas, das an seinen Bedingungen festhalten sollte, unabhängig davon, was sich ändert oder wer es verwendet / transformiert. Das heißt, eine Eigenschaft einer Klasse erfüllt oder erfüllt immer eine bestimmte Bedingung, selbst nachdem Transformationen mit öffentlichen Methoden durchgeführt wurden. Der Client oder Benutzer dieser Klasse ist also über die Klasse und ihre Eigenschaft informiert.
Beispielsweise,
quelle
Dies sind Fakten, die für eine Instanzklasse zutreffen müssen. Wenn eine Klasse beispielsweise eine Eigenschaft X hat und die Invariante X sein kann, muss sie größer als 0 sein. Meines Wissens gibt es keine integrierte Methode zum Verwalten von Invarianten. Sie müssen Eigenschaften privat machen und sicherstellen, dass Ihre Getter und Setter die Invarianzeigenschaft erzwingen.
Es sind Anmerkungen verfügbar, mit denen Eigenschaften mithilfe von Reflexion und Interzeptoren überprüft werden können. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html
quelle