簡體   English   中英

在幾個構造函數中重復的只讀屬性設置代碼

[英]Readonly property set code repeated in several constructor

我有一個DataStructure類,我希望它是不可變的。

通常,我只是確保將我的所有成員都定義為readonly -作業完成。 但是成員之一是一個列表(整數),因此我需要確保該List不能被修改; 所以我將其更改為ReadOnlyCollection<T> 精細。

我還需要以某種方式對集合進行排序-再次好,在通過.AsReadOnly()對其進行轉換之前,我對列表進行了相應的排序。

到目前為止,一切都很好。

但是最后一步是我需要3個不同的構造函數-每個構造函數都接受不同格式的原始數據。 現在,我必須在每個構造函數中復制將列表轉換為必要格式的代碼。

如果我將其setList()化為setList()方法,則該變量不能為readonly ,因為它是在非構造方法中分配的。 現在我已經失去了一些不變性。

理想情況下,我可以通過某種方式聲明只能從構造函數中調用setList方法,從而可以編輯readonly成員,但我認為這不存在。

我可以將所有內容包裝在吸氣劑中,依此類推,這樣該類從外部是不可變的,但是我希望它也從內部是不可變的(特別是考慮到我可以實現這一點,就是我犧牲了DRYness)

是否有人對我已經遺忘的語言功能有任何聰明的想法可以解決此問題?

您可以使用List PrepareList(List)而不是使用從構造函數調用的void SetList(List) List PrepareList(List) 此方法將准備列表,並將其返回給調用者-即:構造函數。

因此,該代碼將不會重復-除了每個構造函數中的_list = PrepareList(list)

您可以將其作為類中的普通列表保留,但僅將其作為只讀暴露給外部(只需在屬性中返回.AsReadOnly() )。

盡管如果您確實希望內部不變性,則構造函數可以相互調用:

public Foo( int a ) { ... }
public Foo( string a ) : this( int.Parse( a ) ) { ... }

因此,您可以將大多數代碼包含在一個構造函數中(如果需要,甚至可以包含一個私有的構造函數),並在其他構造函數中進行轉換。 編輯:用這種方法很難完成很多工作,因此我仍然認為您應該將轉換移到方法中。 如果該方法不訪問任何類成員,則它在內部仍然是不可變的。

我個人更喜歡的另一種模式(即使只是在語法上有所不同)是:

private Foo( int a ) { ... }

public static Foo FromBar( Bar b )
{
    int x;
    // convert from Bar here
    return new Foo( x );
}

public static Foo FromSomethingElse( SomeThingElse b )
{
    int x;
    // convert from SomeThingElse here
    return new Foo( x );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM