【问题标题】:Java - fire event when any property of object changesJava - 当对象的任何属性发生变化时触发事件
【发布时间】:2012-03-22 01:17:08
【问题描述】:

在 Java 中,当对象的任何属性发生变化时,对象触发事件的最优雅方式是什么?

我的领域模型有几个对象,比如

class MyClass {

    String id;
    String name;
    Collection<MyThing> mythings= new HashSet<MyThing>();
    // more fields...
    Date lastUpdated;

    //constructor, getters and setters, etc
}

每当任何属性(id/name/mythings)发生变化时,我都需要将 lastUpdated 设置为“今天”。

我更喜欢不是特定于 JDO 的解决方案,并且绝对不希望在数据存储中使用此逻辑(RDBMS 中的自动时间戳列等)。

我可以放

this.lastUpdated = new Date();

在每个 setter 中,或在每个 setter 中触发自定义事件,但这很丑陋且容易出错。

有没有更优雅的解决方案?

【问题讨论】:

  • 仅供参考,这听起来与 Java bean 完全一样,您可能需要研究一下。
  • AOP 需要一个接口,除非你要进行字节码增强。我通常不使用模型对象的接口。对于这个用例,我不会推荐 AOP。

标签: java


【解决方案1】:

您可以实现PropertyChangeListener 接口并注册您对客户的兴趣。从 1.0 开始,它就成为 Java Bean 规范的一部分。

它们不仅仅与 UI 元素有关。它们被认为是为 IDE(例如 Bean Factory)匹配类似 VB 的功能的一种方式。

http://docs.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html

【讨论】:

  • 我遇到了。 docs.oracle.com/javase/tutorial/javabeans/writing/… - 查看示例,我似乎仍然需要在设置器中为我想要此行为的每个属性触发PropertyChange?
  • 您还希望它如何发生?
  • 我希望有一个自动的“onUpdated”事件隐藏在我可以使用的某个地方,或者一个具有我可以扩展的功能的类。您的回答似乎“尽其所能”;谢谢!
  • @MT1:这需要一些漂亮的继承和动态重写属性设置器。
  • 我不确定这个评论在最初的问题七年后是否有用。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
相关资源
最近更新 更多