【发布时间】:2012-02-22 15:18:51
【问题描述】:
我为我的项目的几个类(多个参数、一些强制性、一些可选等)使用了 Builder 模式。这些类是不可变的(没有 setter,集合 getter 的深拷贝)。
我现在尝试使用持久性框架将这些对象存储在数据库中,该框架使用默认构造函数 + 设置器构造对象。它不太喜欢我的 Builders!
我不想将这种设置降级为 POJO,并失去当前设计的优势(灵活性、不变性、构造安全性)。
我欢迎任何关于可以在这种情况下使用的变通办法的反馈(我可以包装这些类中的每一个,但这会使类的数量增加一倍,我宁愿避免这种情况)。
一个post 实际上指出这是构建器模式的一个特定缺点。
编辑
一个answer 建议使用私有构造函数/设置器,但这仅在类的字段不是最终字段时才有效,这不是我的情况。
最终编辑
谢谢大家。
我认为我的最终解决方案看起来像这样并且工作正常(为了记录,我正在使用 MongoDB + Morphia):
class AClass {
private final String aField;
private final AClass() {
aField = "";
}
//Standard builder pattern after that - no setters (private or public)
}
【问题讨论】:
-
不能包含 setter 和默认构造函数,但将它们设为私有吗?
-
好问题 - 我会检查一下
-
我知道 Hibernate 可以使用私有的 setter 和构造函数,只是想知道你是否有针对特定情况的反对意见。
-
如果可行的话,没有什么反对的。立即测试。
-
如下所述,我的类中的字段是最终的,所以我不能使用私有设置器。否则,您的解决方案将起作用。问题已编辑。
标签: java design-patterns persistence