Java 生成器模式与持久性
我对我的项目的几个类使用构建器模式(多个参数,一些是必需的,一些是可选的,等等)。这些类是不可变的(没有setter,集合getter的深度拷贝) 我现在尝试使用持久性框架将这些对象存储在数据库中,该框架使用默认构造函数+setter构造对象。它不太喜欢我的建筑工人 我不想将该设置降级为POJO,从而失去当前设计的优势(灵活性、不变性、构造安全性) 我欢迎任何关于在这种情况下可以使用的变通方法的反馈(我可以包装这些类中的每一个,但这样会使类的数量增加一倍,我宁愿避免这样) 实际上,有人指出这是构建器模式的一个特定缺点 编辑 有人建议使用私有构造函数/设置器,但这仅在类的字段不是final时有效,我的情况并非如此 最终编辑 谢谢大家。Java 生成器模式与持久性,java,design-patterns,persistence,Java,Design Patterns,Persistence,我对我的项目的几个类使用构建器模式(多个参数,一些是必需的,一些是可选的,等等)。这些类是不可变的(没有setter,集合getter的深度拷贝) 我现在尝试使用持久性框架将这些对象存储在数据库中,该框架使用默认构造函数+setter构造对象。它不太喜欢我的建筑工人 我不想将该设置降级为POJO,从而失去当前设计的优势(灵活性、不变性、构造安全性) 我欢迎任何关于在这种情况下可以使用的变通方法的反馈(我可以包装这些类中的每一个,但这样会使类的数量增加一倍,我宁愿避免这样) 实际上,有人指出这是构
我认为我的最终解决方案是这样的,而且效果很好(记录在案,我使用的是MongoDB+Morphia):
正如我在评论中所说:您可以包括一个默认构造函数和所有必需的setter,但要使它们私有。通过这种方式,您可以保持对象的不变性,但是像Hibernate这样的ORM将能够在需要时访问方法/构造函数
其他任何人也可以使用反射访问这些方法,但是他们也可以使用反射访问私有成员变量。因此,添加私有方法并没有真正的缺点。您不能包含setter和默认构造函数,但将它们设置为私有吗?好问题-我会检查我是否知道Hibernate可以使用私有setter和构造函数,只是想知道您是否对您的特定情况有任何异议。如果这样做有效,没有任何异议。现在就开始测试。如下所述,我的类中的字段是最终字段,所以我不能使用私有setter。否则,您的解决方案将起作用。问题已编辑。如果字段不是最终字段,则此选项有效。但是如果它们是,那么我就不能使用默认构造函数/私有设置器,原因很明显。如果持久性框架使用反射来访问私有构造函数,那么它应该能够直接设置类字段。即使字段是final,也可以这样做。将字段设置为final显然是使对象不可变的一部分,但是如果没有用于修改对象的公共方法,是否需要将字段设置为final?除了确保您自己不会在类内部的方法中意外修改值之外?经过一些尝试和错误后,它通过创建一个默认构造函数来工作,该构造函数将虚拟值分配给最终字段,而不提供私有setter(因此我可以将字段保留为最终字段),因为框架似乎在执行@FFJoe上面所说的操作。
class AClass {
private final String aField;
private final AClass() {
aField = "";
}
//Standard builder pattern after that - no setters (private or public)
}