我有一个DataStructure类,我希望它是不可变的。
通常,我只需确保我的所有成员都被定义为readonly -作业完成。但是其中一个成员是一个列表( ints),所以我需要确保List不能被修改;所以我将它更改为一个ReadOnlyCollection<T>。很好。
我还需要以某种方式对该集合进行排序--同样好,在通过.AsReadOnly()转换列表之前,我会对列表进行相应的排序。
到目前为止,一切都很好。
但是最后一步是,我想要3个不同的构造函数--每个构造函数以不同的格式接受原始数据。现在,我必须在每个构造函数中复制将列表转换为必要格式的代码。
如果我把它概括成一个setList()方法,那么变量就不能是readonly,因为它是在一个非构造函数方法中分配的。现在我失去了一些不变的东西。
理想情况下,我可以通过某种方式声明setList方法只能从构造函数中调用,因此允许编辑readonly成员,但我认为这是不存在的。
我可以在getter中创建任何东西,等等,这样类从外部是不可变的,但是我希望它从内部也是不可变的(特别是考虑到我可以实现这一点,我牺牲了DRYness)
有没有人对我已经忘记的语言特性有什么聪明的想法可以解决这个问题呢?
发布于 2014-07-06 14:30:28
与其使用从构造函数调用的void SetList(List),不如使用List PrepareList(List)。此方法将准备列表,并将其返回给调用方-ie:构造函数。
因此,代码将不会重复-except,这是每个构造函数中的一个伪_list = PrepareList(list)。
发布于 2014-07-06 14:22:52
您可以将它作为普通列表保存在类中,但只将其公开为只读到外部(只需在属性中返回.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 );
}https://stackoverflow.com/questions/24596776
复制相似问题