101

このトピックをグーグルで検索しましたが、ウィキペディア以外に役立つドキュメントや記事は見つかりませんでした。

誰かが私にそれが何を意味するのかを簡単な言葉で説明したり、素敵で理解しやすいドキュメントを紹介してくれませんか?

4

3 に答える 3

104

Javaに関しては特に意味はありません。

クラス不変条件は、他のコードが何を行っても、クラスのすべてのインスタンスを常に保持する単純なプロパティです。

例えば、

class X {
  final Y y = new Y();
}

yX には、プロパティがあり、それは決してなくnull、 type の値を持つというクラス不変条件がありますY

class Counter {
  private int x;

  public int count() { return x++; }
}

これは、2 つの重要な不変条件を維持できません。

  1. countアンダーフローの可能性があるため、負の値を返すことはありません。
  2. その呼び出し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 も例外ではありません。

  1. Java クラスは一貫してプロパティとメソッドを持っている場合と持っていない場合があるため、インターフェイスの不変条件は簡単に維持できます。
  2. Java クラスはフィールドを保護できるため、private非公開データに依存する不変式は保守が容易です。
  3. Java クラスは final になる可能性があるため、悪意のあるサブクラスを作成して不変条件に違反するコードがないことに依存する不変条件を維持できます。
  4. Java ではnull、さまざまな方法で値を忍び込ませることができるため、「真の値を持つ」不変条件を維持するのは困難です。
  5. Java にはスレッドがあります。これは、同期しないクラスが、一緒に発生するスレッド内の順次操作に依存する不変条件を維持するのに問題があることを意味します。
  6. Java には例外があり、「プロパティ p で結果を返す、または結果を返さない」などの不変条件を簡単に維持できますが、「常に結果を返す」などの不変条件を維持するのは困難です。

† -外部性またはTCB違反は、システム設計者が楽観的に起こらないと想定するイベントです。

通常、基本的なハードウェアが、それらの上に構築された高級言語の特性について話すとき、宣伝どおりに機能することを信頼するだけであり、不変条件が保持するという私たちの議論は、次の可能性を考慮していません。

  • プログラマーがデバッグ フックを使用してローカル変数を変更し、コードでは実行できない方法でプログラムを実行します。
  • ピアはルックアップ テーブルsetAccessibleを変更するためにリフレクションを使用しません。private
  • Loki が物理演算を変更すると、プロセッサが 2 つの数値を誤って比較します。

システムによっては、TCB にシステムの一部しか含まれていない場合があるため、

  • 管理者または特権デーモンが JVM プロセスを強制終了することはありません。

...しかし、次のように仮定できます。

  • 信頼できるトランザクション ファイル システムにチェックポイントできます。

システムのレベルが高いほど、通常、TCB は大きくなりますが、TCB から得られる信頼性の低いものほど、不変条件が保持される可能性が高くなり、長期的にはシステムの信頼性が高くなります。

于 2012-01-17T22:07:30.037 に答える
12

これらは、インスタンス クラスについて真でなければならない事実です。たとえば、クラスにプロパティ X があり、不変条件を指定できる場合、X は 0 より大きくなければなりません。私の知る限り、不変条件を維持するための組み込みメソッドはありません。プロパティを非公開にし、ゲッターとセッターが不変プロパティを強制するようにする必要があります。

リフレクションとインターセプターを使用してプロパティをチェックできる注釈が利用可能です。 http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html

于 2012-01-17T22:05:45.563 に答える