黑马程序员技术交流社区
标题:
来大神,帮注释下这段代码。
[打印本页]
作者:
奋斗的青春
时间:
2012-11-9 00:06
标题:
来大神,帮注释下这段代码。
存在一个JavaBean,它包含以下几种可能的属性: 1:boolean/Boolean 2:int/Integer
3:String 4:double/Double 属性名未知,现在要给这些属性设置默认值,以下是要求的默认值:
String类型的默认值为字符串
www.itheima.com
int/Integer类型的默认值为100
boolean/Boolean类型的默认值为true double/Double的默认值为0.01D.
只需要设置带有getXxx/isXxx/setXxx方法的属性,非JavaBean属性不设置,请用代码实现
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class Test5 {
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
private String site = "www.itheima.com";
private boolean validated = true;
private int amount = 100;
private double price = 0.01;
public Test5() {
}
public final String getSite() {
return site;
}
public final void setSite(final String site) {
pcs.firePropertyChange("", getSite(), site);
this.site = site;
}
public final boolean isValidated() {
return validated;
}
public final void setValidated(final boolean validated) {
pcs.firePropertyChange("validate", isValidated(), validated);
this.validated = validated;
}
public final int getAmount() {
return amount;
}
public final void setAmount(final int amount) {
pcs.firePropertyChange("amount", getAmount(), amount);
this.amount = amount;
}
public final double getPrice() {
return price;
}
public final void setPrice(final double price) {
pcs.firePropertyChange("price", getPrice(), price);
this.price = price;
}
public void addPropertyChangeListener(final PropertyChangeListener l) {
pcs.addPropertyChangeListener(l);
}
public void removePropertyChangeLister(final PropertyChangeListener l) {
pcs.removePropertyChangeListener(l);
}
public static void main(final String[] args) {
final Test5 bean = new Test5();
bean.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
// TODO Auto-generated method stub
}
});
bean.setAmount(200);
bean.setValidated(false);
bean.setSite("www.itcast.cn");
bean.setPrice(10.10);
}
}
复制代码
作者:
杨志男
时间:
2012-11-9 10:15
这段代码是在使用PropertyChangeSupport工具类来改变JavaBean类的绑定属性值,先来开下API给这个类的解释吧:
这是一个实用工具类,支持
绑定 (bound) 属性
的 bean 可以使用该类。可以
使用此类的实例作为 bean 的成员字段
,并将各种工作委托给它。
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);
1)这样可以将添加和移除监听器的任务交给这个对象,
也就是实现第二个机制
:
public void addPropertyChangeListener(PropertyChangeListener listener)
{
listeners.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
listeners.removePropertyChangeListener(listener);
}
2)当bean的属性发生变化时,使用PropertyChangeSupport对象的firePropertyChange方法,会
将一个事件发送给所有已经注册的监听器
。该方法有三个参数:属性的名字、旧的值以及新的值。
属性的值必须是对象
,如果是基本数据类型,则必须进行包装。listeners.firePropertyChange("ourString", oldString, newString);
所有注册的监听器
实现PropertyChangeListener接口
,该接口中
只有一个方法。public void propertyChange(PropertyChangeEvent e)
当bean的属性值发生变化时,该方法中的代码就会被触发。可以通过e.getOldValue();
e.getNewValue();来得到changes.firePropertyChange("ourString", oldString, newString);中的oldString和newString
3.为什么要使用PropertyChangeSupport
使用这个类管理监听器的好处是,它是线程安全的。如果使用一个循环体来set Bean的属性,则这个类可以保证所有监听器执行触发事件的有序。
还有一个好处是,这个类支持fire带索引的属性改变事件(详见java.bean.IndexedPropertyChangeEvent)。此时向注册的监听器发送一个PropertyChangeEvent的方法为:void fire
Indexed
PropertyChange(String PropertyName,int index,Object oldValue,Object newValue)
4.把你的代码稍稍改了一下做个实例演示。我只注释一部分,其他的都是一个道理
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class Test5 {
private PropertyChangeSupport pcs = new PropertyChangeSupport(this);//要使用PropertyChangeSupport类,<font color="black">bean必须有一个此类的数据域。</font>
private String site = "<a >www.itheima.com</a>";
public Test5() {
}
public String getSite() {
return site;
}
public void setSite(String newSite) {
//将旧属性值进行改变
String oldSite=site;
site=newSite;
pcs.firePropertyChange("site",oldSite,newSite);//<font color="black">将一个事件发送给所有已经注册的监听器</font>
}
//用这两个方法注册监视器
public void addPropertyChangeListener(PropertyChangeListener l) {
pcs.addPropertyChangeListener(l);
}
public void removePropertyChangeLister(PropertyChangeListener l) {
pcs.removePropertyChangeListener(l);
}
public static void main(String[] args) {
final Test5 bean = new Test5();
bean.setSite("www.itcast.cn");
bean.addPropertyChangeListener(new PropertyChangeListener() {
@Override
//重写类属性管理监视器的唯一方法
public void propertyChange(PropertyChangeEvent evt) {
//获取旧值和新值
System.out.println(evt.getOldValue());
System.out.println(evt.getNewValue());
}
});
}
}
复制代码
有个建议,只在需要使用final的情况下再使用它,不要处处都用
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2