2011-06-25 48 views
2

我設計了一個類,其中包含有關將在SQL Server數據庫中註冊的給定對象的一些信息。我想使這個對象(深)不可變,但我也必須確保它只被註冊一次。如果這個對象實現了下面的模式,它仍然可以被認爲是不可變的嗎?這樣的對象可以被認爲是不可變的嗎?

public class NewClass 
{ 
    private bool registered; 

    public string SomeProperty { get; private set; } 

    public NewClass Register() 
    { 
     if (registered) 
     { 
      throw new NotImplementedException(/*arguments*/); 
     } 

     /* Register on DB here... */ 
     registered = true; 
     return new NewClass(somePropertyFromDB); 
    } 

    public NewClass(string someProperty) 
    { 
     registered = false; 
     SomePropery = someproperty; 
    } 
} 

我要說的是,除了布爾字段registered對象是不可改變的,但是這個領域讓我有些疑惑,因爲它實際上將在第一時間執行Register方法改變......誰能告訴我怎樣才能解決這個問題,並仍然使對象不可變?

回答

3

不,它絕對是不是不可變的。 registered值在對象的生命週期中發生變化。

爲了讓一成不變的,你不能讓registered場在對象的生命週期變化 - 相反,使Register回報這對於registered

一個true值的新對象我還刪除私人二傳手SomeProperty,只有一個getter和一個只讀變量。

因此,像這樣:

public class NewClass 
{ 
    private readonly bool registered; 
    private readonly string someProperty; 

    public bool Registered { get { return registered; } } 
    public string SomeProperty { get { return someProperty; } } 

    public NewClass Register() 
    { 
     // Note the change of exception here 
     if (registered) 
     { 
      throw new InvalidOperationException("Already registered"); 
     } 

     return new NewClass(somePropertyFromDB, true); 
    } 

    // You may want to have a public constructor with just someProperty 
    // which calls this one, which you could make private 
    public NewClass(string someProperty, bool registered) 
    { 
     this.registered = registered.; 
     this.someProperty = someproperty; 
    } 
} 

一些注意事項:

  • 另一種選擇是有兩個單獨的類,RegisteredFooUnregisteredFoo;這可能會使它更容易理解使用此類的代碼
  • 沒有什麼可以阻止某人呼叫Register兩次,所以使這種不可變的方式在冪等性方面沒有任何幫助。由於存在自然的副作用(與數據庫交談),很難使其具有真正的功能。
+0

喬恩,謝謝你的回答,但'SomeProperty'的setter被標記爲'private'。至於解決'註冊'問題的方法,即使這樣我也不能保證用戶不寫'Instance1.Register(); Instance1.Register()'。他們都會返回一個新的對象,但由於我保留了原始引用,所以我可以多次執行這些方法。 – User

+0

@用戶:是的,我只是注意到了這一點,並編輯了我的答案。進一步編輯... –

相關問題