当getter返回一个属性时,例如返回List
其他相关对象,该列表和它的对象是否应该是不可变的以防止类外的代码,更改这些对象的状态,而主要的父对象不知道?
例如,如果一个Contact
对象,具有getDetails
吸气剂,它返回一个List
的ContactDetails
目的,那么任何码调用该吸气剂:
可以ContactDetail
在没有Contact
对象知道的情况下从该列表中删除对象.
可以在ContactDetail
没有Contact
对象知道的情况下更改每个对象.
那我们该怎么办呢?我们应该只是信任调用代码并返回容易变化的对象,还是努力工作并为每个可变类创建一个不可变类?
这是一个问题,你是否应该在你的代码中"防守".如果您是您班级的(唯一)用户并且您相信自己,那么无论如何都不需要不可变性.但是,如果此代码无论如何都需要工作,或者您不信任您的用户,那么将外部化的所有内容都变为不可变.
也就是说,我创建的大多数属性都是可变的.偶尔的用户会把这种情况搞得一团糟,但是这又是他/她的错,因为有明确证明突变不应该通过吸气剂接收的可变物体发生.
这取决于具体情况.如果列表是可变的,那么当List拥有一个非常好的API时,没有必要用主要类的API来改变它.
但是,如果主类无法处理突变,那么您将需要返回一个不可变列表 - 列表中的条目本身也可能需要是不可变的.
但是,不要忘记,您可以返回一个自定义List实现,该实现知道如何安全地响应变异请求,无论是通过触发事件还是直接执行任何所需的操作.事实上,这是使用内部类的好时机的典型例子.
如果您可以控制调用代码,那么最重要的是您所做的选择在所有正确的位置都能很好地记录下来.