1

私は自分で書くことができますが、これは非常に標準的だと思います。これを行う標準のJavaクラスはありますか? コードのさまざまな部分が互いに何をしているのかを知らずに設定できるため、これはランタイム機能でなければならないことを私は知っています.

public class MutableOnce<Type T> {
    private T _t;
    private boolean _isSet = false;
    public void set(T t) {
        if(_isSet) {
            //raise exception
        }
        _t = t;
    public T get() { return _t; }
}
4

2 に答える 2

6

オブジェクトを単に不変にしたくない理由はありますか? 特に並行環境では、クラスがはるかに使いやすくなります(例のクラスはスレッドセーフではありません)。

public class Immutable<T> {
    private final T _t;
    public void Immutable(T t) {
        _t = t;
    }
    public T get() { return _t; } //you may want to return a copy of _t if _t is mutable
}
于 2012-04-25T14:21:46.647 に答える
1

クイック検索の後:

  1. すべてのフィールドはプライベートで、できれば final でなければなりません
  2. クラスをオーバーライドできないようにする - クラスを final にするか、静的ファクトリを使用してコンストラクタを非公開にする
  3. フィールドはコンストラクター/ファクトリーから入力する必要があります
  4. フィールドにセッターを提供しないでください
  5. コレクションに注意してください。Collections.unmodifiable* を使用します。また、コレクションには不変のオブジェクトのみを含める必要があります
  6. すべてのゲッターは不変オブジェクトを提供するか、防御コピーを使用する必要があります
  7. オブジェクトの内部状態を変更するメソッドを提供しないでください。

出典:オブジェクトを不変にする可能な方法

于 2012-04-25T14:23:01.897 に答える