知道在类中定义的任何变量的值何时更改

时间:2018-05-07 13:45:50

标签: java pojo

我已经定义了一个类似于模型/ pojo的类。该类有许多键/变量。我已经实现了将POJO存储在磁盘上以供将来使用的自定义解决方案。现在我要做的是,每当更改类/ POJO中的任何值时,我应该调用一个方法,将新的更改与磁盘上的文件同步。

我知道我可以为每个变量定义setter。但是对于100个直接和子字段来说这是相当繁琐的,即使我为每个字段定义了setter,我也必须从所有setter调用sync函数。

我需要的是单个代理setter或拦截器,用于所有更改推送到类中的变量。

我在Android应用程序中使用它,因此每当用户在他/她的帐户中输入新的详细信息时,我必须在该特定时间存储这些详细信息以防止数据丢失。我正在使用GSON进行串行化和反序列化。

对于使用含糊的术语表示抱歉,从未上过大学:|。

3 个答案:

答案 0 :(得分:1)

最简单的解决方案确实是使用setter。您只需为要监视的每个字段创建一个,并且大多数IDE会为您生成它们,或者您可以使用类似Koloboke的东西,因此它很乏味并不是真正的争论。

代理类或反射也是可能的,但这非常hacky。另一种方法是异步观察者/工作者检查你的POJO实例的变化,但即使这样看起来也不必要地复杂。

除此之外,如果POJO结构有很多字段,您可能需要重新考虑它。

答案 1 :(得分:1)

在每个属性更新上持久化(在您的情况下写入磁盘)实体的问题是大多数更新正在修改多个属性。所以万一你有这样的代码:

entity.setA(avalue);
entity.setb(bvalue);
entity.setc(cvalue);

你会把它写入磁盘3次,这可能不是最好的方法,因为它需要更多的资源,并且3次写入中有2次是不必要的。

有几种方法可以解决它。想象一下,您有一些将此数据保存到磁盘的服务,请将其命名为entityRepository。因此,每次要保存/更新实体时,一个选项是手动调用此entityRepository。与在setter调用中自动调用它相比,它似乎非常不舒服,但是,这种方法清楚地向您显示您的实体被持久化/更新的时间和原因,在您的方法中不清楚,并且可能导致未来问题和错误的一些问题,例如,在将来你将决定你现在需要更新其中一个属性而不是无意中持久,那么看起来你需要2个setter,一个有更新,一个没有...

另一种方法是添加version属性,并在此setter调用entityRepository.save(this)内调用其setter。

另一种方式是查看AOP,但无论如何,我不建议任何更改持久化实体,而无法控制它。

答案 2 :(得分:0)

您正在谈论数据绑定。没有内置的方法,所以你确实自己同步它。看看How to Write a Property Change Listener。还有很多其他的方法,但没有内置方式。