Java属性更改侦听器

Jij*_*joy 2 java

我想知道,java beans属性如何改变侦听器的工作方式.他们在里面使用EventListeners吗?当我们可以使用mediator模式的POJO实现时,使用属性更改侦听器是否好.我的意思是表现明智?

谢谢J

Kev*_*Day 6

优点在于耦合领域. mediator要求您的类知道中介(例如,通过将中介实例传递给构造函数).调解员可以非常强大,并且绝对可以提供更有效的通知 - 但代价是显着的复杂性.

相比之下,Observer设计模式(JavaBeans属性更改侦听器是其实现)更容易实现.但是它们可以在复杂系统中具有有趣的紧急行为.

在许多情况下,Observer绰绰有余(特别是在JavaBeans倾向于使用的领域).在其他情况下,它远远不够 - 一个很好的例子是在Glazed Lists库中的事件传播.他们不得不使用EventPublisher(它是一个中介)来优化事件通知顺序,并确保在事件传播之前满足依赖关系.

因此,您的问题的答案是,这不是POJO与JavaBeans的问题.这是一个设计模式(Observer或Mediator)对于给定的用例最有意义的问题.两种模式都集中在将系统的各部分相互分离.两种模式都有适合的情况.对于大量的情况,Observer很好 - 而且真的,非常容易编写.

我还应该提到中间事件对象的使用在Observer和Mediator实现中都很常见,因此这是一个副作用问题.但现代虚拟机在处理像这样的短期物体时非常有效 - 所以它确实是一个非问题.


Aar*_*lla 5

你寻找的代码是在java.beans.PropertyChangeSupport.你这样使用它:

protected transient PropertyChangeSupport changeSupport = new PropertyChangeSupport (this);

public void addPropertyChangeListener (String propertyName, PropertyChangeListener listener)
{
    changeSupport.addPropertyChangeListener (propertyName, listener);
}

public void removePropertyChangeListener (String propertyName, PropertyChangeListener listener)
{
    changeSupport.removePropertyChangeListener (propertyName, listener);
}

public void firePropertyChange (String propertyName, BigDecimal oldValue, BigDecimal newValue)
{
    if (oldValue != null && newValue != null && oldValue.compareTo (newValue) == 0) {
        return;
    }
    changeSupport.firePropertyChange(new PropertyChangeEvent(this, propertyName,
                                               oldValue, newValue));

}
Run Code Online (Sandbox Code Playgroud)

使用此API的主要优点是每个人都熟悉它.主要缺点是Beans API相当陈旧,从现在的角度来看很麻烦,而且非常有限.

例如,您需要许多地方的属性名称.这意味着您必须复制一个字符串(如果重命名该属性,则会中断)或者必须为每个繁琐的字段手动定义字符串常量.

实现本身非常快,遵循Observer设计模式.当然,还有其他方法可以实现这一点.价格将是不再是一个bean,因为它不遵循API.因此,如果没有额外的粘合代码,您就无法在许多框架中使用您的对象.