このトピックをグーグルで検索しましたが、ウィキペディア以外に役立つドキュメントや記事は見つかりませんでした。
誰かが私にそれが何を意味するのかを簡単な言葉で説明したり、素敵で理解しやすいドキュメントを紹介してくれませんか?
このトピックをグーグルで検索しましたが、ウィキペディア以外に役立つドキュメントや記事は見つかりませんでした。
誰かが私にそれが何を意味するのかを簡単な言葉で説明したり、素敵で理解しやすいドキュメントを紹介してくれませんか?
Javaに関しては特に意味はありません。
クラス不変条件は、他のコードが何を行っても、クラスのすべてのインスタンスを常に保持する単純なプロパティです。
例えば、
class X {
final Y y = new Y();
}
y
X には、プロパティがあり、それは決してなくnull
、 type の値を持つというクラス不変条件があります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 違反†</sup> がない場合) 。count
クラスを持つ各言語では、一部のクラスの不変条件を簡単に維持できますが、他のクラスの不変条件はそうではありません。Java も例外ではありません。
private
非公開データに依存する不変式は保守が容易です。null
、さまざまな方法で値を忍び込ませることができるため、「真の値を持つ」不変条件を維持するのは困難です。† -外部性またはTCB違反は、システム設計者が楽観的に起こらないと想定するイベントです。
通常、基本的なハードウェアが、それらの上に構築された高級言語の特性について話すとき、宣伝どおりに機能することを信頼するだけであり、不変条件が保持するという私たちの議論は、次の可能性を考慮していません。
setAccessible
を変更するためにリフレクションを使用しません。private
システムによっては、TCB にシステムの一部しか含まれていない場合があるため、
...しかし、次のように仮定できます。
システムのレベルが高いほど、通常、TCB は大きくなりますが、TCB から得られる信頼性の低いものほど、不変条件が保持される可能性が高くなり、長期的にはシステムの信頼性が高くなります。
これらは、インスタンス クラスについて真でなければならない事実です。たとえば、クラスにプロパティ X があり、不変条件を指定できる場合、X は 0 より大きくなければなりません。私の知る限り、不変条件を維持するための組み込みメソッドはありません。プロパティを非公開にし、ゲッターとセッターが不変プロパティを強制するようにする必要があります。
リフレクションとインターセプターを使用してプロパティをチェックできる注釈が利用可能です。 http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html