Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成器模式与持久性_Java_Design Patterns_Persistence - Fatal编程技术网

Java 生成器模式与持久性

Java 生成器模式与持久性,java,design-patterns,persistence,Java,Design Patterns,Persistence,我对我的项目的几个类使用构建器模式(多个参数,一些是必需的,一些是可选的,等等)。这些类是不可变的(没有setter,集合getter的深度拷贝) 我现在尝试使用持久性框架将这些对象存储在数据库中,该框架使用默认构造函数+setter构造对象。它不太喜欢我的建筑工人 我不想将该设置降级为POJO,从而失去当前设计的优势(灵活性、不变性、构造安全性) 我欢迎任何关于在这种情况下可以使用的变通方法的反馈(我可以包装这些类中的每一个,但这样会使类的数量增加一倍,我宁愿避免这样) 实际上,有人指出这是构

我对我的项目的几个类使用构建器模式(多个参数,一些是必需的,一些是可选的,等等)。这些类是不可变的(没有setter,集合getter的深度拷贝)

我现在尝试使用持久性框架将这些对象存储在数据库中,该框架使用默认构造函数+setter构造对象。它不太喜欢我的建筑工人

我不想将该设置降级为POJO,从而失去当前设计的优势(灵活性、不变性、构造安全性)

我欢迎任何关于在这种情况下可以使用的变通方法的反馈(我可以包装这些类中的每一个,但这样会使类的数量增加一倍,我宁愿避免这样)

实际上,有人指出这是构建器模式的一个特定缺点

编辑

有人建议使用私有构造函数/设置器,但这仅在类的字段不是final时有效,我的情况并非如此

最终编辑

谢谢大家。
我认为我的最终解决方案是这样的,而且效果很好(记录在案,我使用的是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)
}