【问题标题】:Why Java allows to fire property change when old and new values are null为什么 Java 允许在旧值和新值都为空时触发属性更改
【发布时间】:2019-08-02 10:07:46
【问题描述】:

当两个值(旧的和新的)都为空时,PropertyChangeSupport 类会触发 PropertyChangeEvent。有人可以解释一下这种行为的原因是什么吗?我的一些同事将此行为用于事件驱动的操作,但我认为这是对属性更改模式的滥用。我是对的还是我误解了什么?

我的意思是这行代码:

propertyChangeSupport.firePropertyChange(XY_PROPERTY, null, null);

【问题讨论】:

  • 他们似乎只是使用了 beans 包中的一个旧错误,它允许这样做。通常,当使用相等的值调用时,不会触发该事件,但特别是对于空值,我看到的代码为 if (old == null || new == null || !old.equals(new)) { fire }。是的,这看起来像是一种误用——如果你想要自定义事件,你应该实现自定义事件。不幸的是,Java 的事件依赖于继承,PropertyChangeSupport 占据了Observable 机制的唯一槽。所以你不能同时拥有这两者,除非你的自定义事件Observable 也应该是-a PropertyChangeSupport
  • @M.Prokhorov 谢谢。我也看过这段代码。所以你认为这是一个 Java 错误,是为了功能(如微软)而设计的?

标签: java javabeans


【解决方案1】:

我认为,这是一个哲学问题——null 不是“正常”值,null 表示“未知”,“未知”不能与另一个“未知”进行比较,所以如果你将属性值从“未知”到“未知”,这是一个新的“未知”值。数据库中的情况如此相似 - NULL 始终不等于 NULL。

来自 Bean 规范:“如果旧值和新值的真实值未知,则可以为它们提供空值。”

Bean 规范中的另一个原因:“事件源可以发送一个空对象作为名称,以指示其属性是否已更改的任意集合。在这种情况下,旧值和新值也应该为空。”

有关更多详细信息,您可以查看 2002 年的开放 jdk 问题 4763463:(https://bugs.openjdk.java.net/browse/JDK-4763463)

我认为,这对开发来说不是很舒服,但确实如此。我们不能改变它:-(

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-06
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2012-08-12
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多