【问题标题】:Know when value of any variable defined inside the class is changed知道类内定义的任何变量的值何时更改
【发布时间】:2018-05-07 13:45:49
【问题描述】:

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

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

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

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

抱歉使用了模糊的术语,从未上过大学:|。

【问题讨论】:

  • Eclipse 让您有机会通过 3 或 4 次单击为您的字段添加设置器。值得尝试。 (来源->添加设置器/获取器)。但是对于您的同步方法,我不知道您如何实现您的要求
  • 如果没有setter方法,POJO如何更新?您确定要在更新单个字段时写入磁盘吗?那么比如更新了 5 个字段,就会有 5 次磁盘写入?
  • 查看面向方面的编程,尤其是 AspectJ。在更改底层变量之后,您可以在所有设置器中定义一个切入点,并附加和建议执行同步到磁盘的逻辑。 baeldung.com/aspectj
  • @AndrewS 我在一个 android 应用程序中使用它,所以每当用户输入他/她的帐户的新详细信息时,我必须将这些详细信息存储在该特定实例中。我使用 GSON 进行序列化和反序列化。
  • 为什么更新单个字段?为什么不在用户单击保存按钮时,或者在调用 Activity.stop()/destroy() 时?

标签: java pojo


【解决方案1】:

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

代理类或反射也是可能的,但那是相当hacky。另一种方法是使用异步观察者/工作者来检查 POJO 实例中的更改,但即使这样看起来也不必要地复杂。

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

【讨论】:

  • 大哥,POJO下面有meta字段,meta字段里面有很多sub field,我不能减少,都是必须的。
  • 您可以通过将字段拆分为多个子对象来减少字段数量。
【解决方案2】:

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

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

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

有几种方法可以处理它。假设您有一些服务可以将此数据保存到磁盘,我们将其命名为entityRepository。因此,一个选项是每次您想保存/更新您的实体时手动调用此entityRepository。与在 setter 调用时自动调用它相比,这似乎很不舒服,但是,这种方法清楚地向您展示了您的实体何时以及为什么被持久化/更新,在您的方法中不清楚,并且可能导致一些问题未来的问题和错误,例如,将来您将决定现在需要更新其中一个属性而不立即持久化,那么您似乎需要 2 个 setter,一个带更新,一个不带...

另一种方法是添加version属性,当在这个setter中调用它的setter时调用entityRepository.save(this)

另一种方法是查看AOP,但无论如何我不建议在没有控制权的情况下对任何更改进行持久化。

【讨论】:

  • 老兄,我现在已经在使用第一种方法,在更新 POJO 后立即调用服务。
【解决方案3】:

您在谈论数据绑定。没有内置的方法,所以你确实必须自己同步它。查看How to Write a Property Change Listener。还有很多其他方法可以解决这个问题,但没有内置方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2014-03-19
    • 2017-09-09
    • 2012-02-29
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    相关资源
    最近更新 更多