为什么Java允许在新旧值为null时触发属性更改

为什么Java允许在新旧值为null时触发属性更改,java,javabeans,Java,Javabeans,当新旧值均为null时,PropertyChangeSupport类将激发PropertyChangeEvent。有人能解释一下这种行为的原因吗?我的一些同事将此行为用于事件驱动的操作,但我认为这是对属性更改模式的滥用。我是对的还是我误解了什么 我指的是这一行代码: propertyChangeSupport.firePropertyChange(XY_PROPERTY, null, null); 我认为,这是一个哲学问题–null不是一个“正常”值,null表示“未知”,并且“未知”不能与另

当新旧值均为null时,PropertyChangeSupport类将激发PropertyChangeEvent。有人能解释一下这种行为的原因吗?我的一些同事将此行为用于事件驱动的操作,但我认为这是对属性更改模式的滥用。我是对的还是我误解了什么

我指的是这一行代码:

propertyChangeSupport.firePropertyChange(XY_PROPERTY, null, null);

我认为,这是一个哲学问题–null不是一个“正常”值,null表示“未知”,并且“未知”不能与另一个“未知”相比较,因此如果将属性值从“未知”更改为“未知”,则它是一个新的“未知”值。在数据库中也是如此——NULL总是不等于NULL

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

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

有关更多详细信息,请参见2002年的开放jdk发行版4763463:


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

他们似乎只是使用了beans包中的一个旧bug,这允许这样做。通常当使用相等的值调用时,事件不会被触发,但特别是对于null,我看到的代码是如果old==null | | new==null | | | old.equalsnew{fire}。是的,这看起来像是误用-如果您想要自定义事件,您应该实现自定义事件。不幸的是,Java的事件依赖于继承,PropertyChangeSupport占据了可观察机制的唯一位置。因此,除非您的自定义可观察事件也应该是-a,否则您不能同时拥有这两个事件PropertyChangeSupport@M.Prokhorov谢谢,我有空你看到这段代码了吗?你认为这是一个Java bug,它的特点和微软一样?