当前位置:  开发笔记 > 编程语言 > 正文

如何创建不可变类?

如何解决《如何创建不可变类?》经验,为你挑选了3个好方法。

我正在创建一个不可变的类.
我已将所有属性标记为只读.

我有一个课程列表.
虽然如果属性是只读的,则可以修改列表.

公开列表的IEnumerable使其不可变.
我想知道为了使一个类不可变而必须遵循的基本规则是什么?



1> Blair Conrad..:

我认为你走在正确的轨道上 -

注入到类中的所有信息都应该在构造函数中提供

所有属性应该只是getter

如果将一个集合(或数组)传递给构造函数,则应该将其复制以防止调用者以后修改它

如果你要返回你的集合,要么返回一个副本或只读版本(例如,使用ArrayList.ReadOnly或类似的东西 - 你可以将它与前一个点结合起来并存储一个只读副本,当它返回时调用者访问它,返回枚举器,或使用允许对集合进行只读访问的其他方法/属性

请记住,如果您的任何成员是可变的,您仍然可能具有可变类的外观 - 如果是这种情况,您应该复制掉您想要保留的任何状态并避免返回整个可变对象,除非您复制它们在将它们交还给调用者之前 - 另一个选择是只返回可变对象的不可变"部分" - 感谢@Brian Rasmussen鼓励我扩展这一点


应复制作为参数传递给构造函数的任何可变引用类型.否则呼叫者仍将保持对州的引用.

2> Joe..:

要成为不可变的,所有属性和字段都应该是只读的.任何列表中的项目本身都应该是不可变的.

您可以按如下方式创建只读列表属性:

public class MyClass
{
    public MyClass(..., IList items)
    {
        ...
        _myReadOnlyList = new List(items).AsReadOnly();
    }

    public IList MyReadOnlyList
    {
        get { return _myReadOnlyList; }
    }
    private IList _myReadOnlyList

}



3> lubos hasko..:

另外,请记住:

public readonly object[] MyObjects;

即使用readonly关键字标记,也不是不可变的.您仍然可以通过索引访问器更改单个数组引用/值.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有