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