私はこのトピックをグーグルで検索しましたが、 Wikipedia に加えて、これ以上役立つドキュメントや記事は見つかりませんでした。
誰でも簡単な言葉でそれが何を意味するのか説明したり、素敵でわかりやすいドキュメントを紹介してくれたりできますか?
Javaに関して特に意味はありません。
クラス不変式は、他のコードが何をするかに関係なく、常にクラスのすべてのインスタンスを保持するプロパティです。
例えば、
class X {
final Y y = new Y();
}
Xにはy
プロパティがあり、決してnull
ではなく、Y
型の値を持つというクラス不変式があります。
class Counter {
private int x;
public int count() { return x++; }
}
2つの重要な不変式を維持できない
count
は決して負の値を返しません。count
の呼び出しは、厳密に単調に増加しています。変更されたクラスは、これら2つの不変式を保持します。
class Counter {
private int x;
public synchronized int count() {
if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
return x++;
}
}
しかし、count
への呼び出しが常に正常に成功する不変式を保存することに失敗します(TCB違反がない場合†)count
は例外をスローするか、デッドロックスレッドがカウンターのモニターを所有している場合にブロックする可能性があるためです。
クラスを含む各言語を使用すると、一部のクラス不変式を簡単に維持できますが、他の不変式は維持できません。 Javaも例外ではありません:
private
フィールドを保護できるため、プライベートデータに依存する不変式は簡単に維持できます。null
の値をさまざまな方法で忍び込ませることができるため、「実際の値を持つ」不変式を維持するのは困難です。†-externalityまたは[〜#〜] tcb [〜#〜] violationは、システム設計者が楽観的に発生しないと想定するイベントです。
通常、基本的なハードウェアは、その上に構築された高レベル言語のプロパティについて説明するときに宣伝どおりに機能することを信頼し、不変式が保持する引数は次の可能性を考慮しません:
setAccessible
でリフレクションを使用してprivate
ルックアップテーブルを変更しません。一部のシステムでは、TCBにシステムの一部のみが含まれる場合があるため、以下のことを想定しない場合があります。
しかし、我々はそれを仮定するかもしれません
システムのレベルが高いほど、そのTCBは通常大きくなりますが、TCBから取得できる信頼性の低いものほど、不変式が保持される可能性が高くなり、システムの長期的な信頼性が高まります。
不変式とは、どのような変更またはそれを使用/変換しても、その条件に固執するものを意味します。つまり、クラスのプロパティは、パブリックメソッドを使用して変換を行った後でも、常にいくつかの条件を満たしているか満たしています。したがって、このクラスのクライアントまたはユーザーは、クラスとそのプロパティについて保証されます。
例えば、
これらは、インスタンスクラスについて真実でなければならない事実です。たとえば、クラスにプロパティXがあり、不変式はXが0より大きくなければならない場合です。私の知る限り、不変式を維持するための組み込みメソッドはありません。
リフレクションとインターセプターを使用してプロパティをチェックできる注釈があります。 http://docs.Oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html