2012-04-25 51 views
1

我可以寫我自己的,但我猜這是非常標準的。有沒有一個標準的java類來做到這一點?我知道這必須是一個運行時功能,因爲我的代碼的各個部分都可以在不知道對方正在做什麼的情況下設置它 - 我只是希望在發生這種情況時這會失敗。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; } 
} 

回答

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 
} 
+0

其他要求是布爾我會包裝默認爲false,這意味着它必須存在之前它的設置 - 這就是爲什麼一個不變的W /構造函數二傳手贏得」工作。我可以使它可以爲空,如果(isNull)將它視爲false ...尋找一個簡單的設計來封裝這個布爾的「設置」。 – djechlin 2012-04-25 14:30:14

+0

爲什麼不在需要時創建對象?在它創建之前它不存在......不知道你用這個結構試圖達到什麼。如果你能解釋**爲什麼你需要這種行爲,這將有所幫助。 – assylias 2012-04-25 14:31:29

+0

這將是可空設計。我不需要「擁有」一個,我需要創建一個地方來存儲它並保持邏輯來檢查我是否已經有一個。考慮到默認值是假的,我可以避免這種情況,只有一個從頭開始只能被重寫一次。聽起來就像我必須下定決心,複雜性在任何設計中都是保守的。 – djechlin 2012-04-25 14:40:31

1

快速搜索後:

  1. 所有字段必須是私有的,最好最後
  2. 確保不能覆蓋類 - 使課堂最後,或者使用靜態工廠,並保持構造私人
  3. 字段必須由構造器/工廠填充
  4. 不要爲字段提供任何設置器
  5. 小心收集。使用Collections.unmodifiable *。另外,集合應該只包含不可變的對象
  6. 所有獲取者必須提供不可變對象或使用防禦性複製
  7. 不要提供任何方法來更改對象的內部狀態。

來源:Possible ways of making an Object immutable