PropertyChangeSupport类

最近看代码一直碰到这个类,先做一个总结。

先看PropertyChangeSupport类的官方文档解释:
  This is a utility class that can be used by beans that support bound properties.  You can use an instance of this class as a member field of your bean and delegate various work to it.

1.关联属性
在JavaBean的设计中, 按照属性的不同作用又细分为四类:单值属性、索引属性、关联属性、限制属性。 关联属性,也称之为绑定属性。绑定属性会在属性值发生变化时,通知所有相关的监听器。为了实现一个绑定属性,必须实现两个机制。
1)  无论何时,只要属性的值发生变化,该bean必须发送一个PropertyChange事件给所有已注册的监听器。
2)  为了使监听器能够注册,bean必须实现以下两个方法:
void addPropertyChangeListener(PropertyChangeListener listener);
void removePropertyChangerListener(PropertyChangerListener listener);
 
2.使用PropertyChangeSupport管理监听器
可以通过java.bean包下的PropertyChangeSupport类来管理监听器。要使用这个类,bean必须有一个此类的数据域。
private PropertyChangeSupport listeners = new PropertyChangeSupport(this);
 
这样可以将添加和移除监听器的任务交给这个对象。
public void addPropertyChangeListener(PropertyChangeListener listener) {
       listeners.addPropertyChangeListener(listener);
}
 
public void removePropertyChangeListener(PropertyChangeListener listener) {
       listeners.removePropertyChangeListener(listener);
}
 
bean的属性发生变化时,使用PropertyChangeSupport对象的firePropertyChange方法,会将一个事件发送给所有已经注册的监听器。该方法有三个参数:属性的名字、旧的值以及新的值。属性的值必须是对象,如果是简单数据类型,则必须进行包装。
listeners .firePropertyChange("ourString", oldString, newString);
 
所有注册的监听器实现PropertyChangeListener接口,该接口中只有一个方法。
public void propertyChange(PropertyChangeEvent e)
bean的属性值发生变化时,该方法中的代码就会被触发。可以通过
e.getOldValue();
e.getNewValue();
来得到changes.firePropertyChange("ourString", oldString, newString);中的oldStringnewString
 
3.为什么要使用PropertyChangeSupport
使用这个类管理监听器的好处是,它是线程安全的。如果使用一个循环体来set Bean的属性,则这个类可以保证所有监听器执行触发事件的有序。
还有一个好处是,这个类支持fire带索引的属性改变事件(详见java.bean.IndexedPropertyChangeEvent)。此时向注册的监听器发送一个PropertyChangeEvent的方法为:
void fireIndexedPropertyChange(String PropertyName,int index,Object oldValue,Object newValue)
 
4.实例代码

public class SomeBean {

 private String property;

 private PropertyChangeSupport changeSupport;

 public void setProperty(String newValue) {

  String oldValue = property;

  property = newValue;

  changeSupport.firePropertyChange("property", oldValue, newValue);

 }

 public void addPropertyChangeListener(PropertyChangeListener l) {

  changeSupport.add(l);

 }

 public void removePropertyChangeListener(PropertyChangeListener l) {

  changeSupport.remove(l);

 }

}

参考文章:

http://www.javalobby.org/java/forums/t19476.html
http://feelingsea.blog.hexun.com/7293978_d.html
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
3.Bound属性 Bound属性是指当该属性的值发生变化时,要通知其他的对象。每次属性值改变时,这种属性就触发一个PropertyChange事件(在Java程序中,事件也是一个对象)。事件中封装了属性名、属性的原值、属性变化后的新值。这种事件传递到其他的Bean,至于接收事件的Bean应该做什么动作由自己定义。也就是说,Bound属性提供了一种机制,即通知监听器一个JavaBean组件的属性发生了改变。监听器实现了PropertyChangeListener接口并接受由JavaBean组件产生的PropertyChangeEvent对象,PropertyChangeEvent对象包括一个属性名字,旧的属性名字,以及每一个监听器可能访问的新属性值。 Bound属性的用法 在程序中要进行触发事件的操作,使用的方法是在PropertyChangeSupport中。所以该行声明并实例化了一个changes对象,在下面将使用changes的firePropertyChange方法来触发outString的属性改变事件。 通过上面的程序代码,开发工具调用changes的addPropertyChangeListener方法把其他JavaBean注册入outString属性的监听者的队列1中,队列1是一个Vector数组,可存储任何Java对象。开发工具也可使用changes的removePropertyChangeListener方法,从队列1中注销指定的对象,使example3的outString属性的改变不再与这个对象有关。当然,当程序员手写代码编制程序时,也可以直接调用这两个方法,把其他Java对象与example3挂接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值