Java 从数据库创建对象后是否初始化临时字段?
我正在使用Morphia和MongoDB。获取数据时,使用默认构造函数(不带参数)创建对象,然后使用反射初始化字段(Kryo和Jackson等序列化库也会这样做)。这样就不可能根据构造函数中字段的值来添加代码(因为它们还没有用数据库中的数据初始化)。我想知道是否有一种方法可以在获取和创建对象之后运行额外的代码,而不必在之后手动调用方法?原因是我正在存储对象的部分数据,并基于它自己的数据和许多引用来初始化额外的瞬态字段。我目前可以想出4个备选方案:Java 从数据库创建对象后是否初始化临时字段?,java,database,mongodb,serialization,morphia,Java,Database,Mongodb,Serialization,Morphia,我正在使用Morphia和MongoDB。获取数据时,使用默认构造函数(不带参数)创建对象,然后使用反射初始化字段(Kryo和Jackson等序列化库也会这样做)。这样就不可能根据构造函数中字段的值来添加代码(因为它们还没有用数据库中的数据初始化)。我想知道是否有一种方法可以在获取和创建对象之后运行额外的代码,而不必在之后手动调用方法?原因是我正在存储对象的部分数据,并基于它自己的数据和许多引用来初始化额外的瞬态字段。我目前可以想出4个备选方案: 当对象为空时,运行类似.initialize()
我目前正在使用1。但是我在争论我应该用3还是4。但是,如果有更好的方法在创建对象后运行某些代码,我想知道。您可以使用
@PostLoad
运行initialize()
并在将数据加载到新实例f时,Morphia自动为您调用该方法,使临时字段成为私有字段和getter方法,检查该字段是否已初始化。如果未初始化,则计算该值并将其缓存。这可能是3和4的组合吗?@WangSheng它实际上是4。这意味着我必须使用对象而不是primitive,但这不应该是一个问题。对不起,我认为“添加方法”意味着添加getter和setter。那么这就是第四种选择。我认为使用包装器而不是原语是完全可以的。我能想到的另一个选择是有一个名为initialized=false
的字段和一个init
方法。在每个getter中,检查initialized
,如果false
调用init
方法。@WangSheng我现在有一个initialize
方法,该方法初始化所有字段,并在每个get
方法为空时调用它。然而,这仍然让人感觉奇怪,因为现在我添加了额外的方法,比如changeFieldBy(int-amount)
,现在我觉得我必须再次检查null或捕获npe
,即使我如何使用代码不太可能为null。我想我必须对一个初始化的布尔值执行同样的操作。所有的选择都让人觉得不安全或不安全。正是我在寻找的,我一定已经在网站上读过了。你能接受这个答案吗,这样其他人就可以更容易地找到它了?谢谢