【发布时间】:2013-04-18 00:44:32
【问题描述】:
我在 Effective Java: Programming Language Guide 中阅读了一些内容 Joshua Bloch 并发现我应该避免使用可变对象。因为我读过这本书,我知道如何使可变对象不可变(例如使用 private 和 final 修饰符)。
不过,我有一个“虚拟”data holder class 有一些私有字段。每个字段都可以通过 get 方法和相应的 set 方法访问。所以由于这个 set methods 这个类的对象不是不可变的。
现在的问题是如何避免这些设置方法?将所有(例如 20 个)参数传递给对象构造函数?我认为这不是很好的设计,因为我必须注意参数的顺序,如果我不想设置特殊参数则必须传递空引用等等。
所以我考虑以下方法:
- 创建一个包含所有 get 方法的接口,并让它从虚拟数据持有者类中实现
- 使用私有构造函数和静态工厂方法创建一个抽象类,该方法返回数据持有者对象的“get”接口实例。
- 在静态工厂方法中,我使用所有必要的 set 方法配置数据持有者对象
- 将数据持有者类包设为私有,以便对象只能通过抽象类中定义的静态工厂方法进行实例化
在下一步中,我将配置和创建的data holder objects 存储在一个列表中。
尽管对象是不可变的,但读取对象modify 的最佳方法是什么?使用静态工厂方法创建一个新对象,该方法在内部设置新值并将其替换为列表中的对象?
【问题讨论】:
-
查看构建器模式。并且请记住,不变性不仅仅是没有设置器。对象也可以通过 getter 进行变异。
标签: java design-patterns abstract-class immutability