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

考虑到对象封装,getter应该返回一个不可变的属性吗?

如何解决《考虑到对象封装,getter应该返回一个不可变的属性吗?》经验,为你挑选了3个好方法。

当getter返回一个属性时,例如返回List其他相关对象,该列表和它的对象是否应该是不可变的以防止类外的代码,更改这些对象的状态,而主要的父对象不知道?

例如,如果一个Contact对象,具有getDetails吸气剂,它返回一个ListContactDetails目的,那么任何码调用该吸气剂:

    可以ContactDetail在没有Contact对象知道的情况下从该列表中删除对象.

    可以在ContactDetail没有Contact对象知道的情况下更改每个对象.

那我们该怎么办呢?我们应该只是信任调用代码并返回容易变化的对象,还是努力工作并为每个可变类创建一个不可变类?



1> Shachar..:

这是一个问题,你是否应该在你的代码中"防守".如果您是您班级的(唯一)用户并且您相信自己,那么无论如何都不需要不可变性.但是,如果此代码无论如何都需要工作,或者您不信任您的用户,那么将外部化的所有内容都变为不可变.

也就是说,我创建的大多数属性都是可变的.偶尔的用户会把这种情况搞得一团糟,但是这又是他/她的错,因为有明确证明突变不应该通过吸气剂接收的可变物体发生.


这是一个有趣的差异 - 天气或不是你拥有代码.从来没有想过我写的那些课外的任何东西都是安全的.我不相信编码是有优势的,假设任何打电话给你的人总会把它弄好......如果在你的职业生涯中有一次20到30分钟,那么跳过几行打字真的会更快调试?与您在项目上花费的时间相比,键入这些额外的行几乎是免费的.

2> Bill Michell..:

这取决于具体情况.如果列表是可变的,那么当List拥有一个非常好的API时,没有必要用主要类的API来改变它.

但是,如果主类无法处理突变,那么您将需要返回一个不可变列表 - 列表中的条目本身也可能需要是不可变的.

但是,不要忘记,您可以返回一个自定义List实现,该实现知道如何安全地响应变异请求,无论是通过触发事件还是直接执行任何所需的操作.事实上,这是使用内部类的好时机的典型例子.



3> Liam..:

如果您可以控制调用代码,那么最重要的是您所做的选择在所有正确的位置都能很好地记录下来.

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