黑马程序员技术交流社区

标题: 来大神,帮注释下这段代码。 [打印本页]

作者: 奋斗的青春    时间: 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属性不设置,请用代码实现
  1. import java.beans.PropertyChangeEvent;
  2. import java.beans.PropertyChangeListener;
  3. import java.beans.PropertyChangeSupport;

  4. public class Test5 {
  5. private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
  6. private String site = "www.itheima.com";
  7. private boolean validated = true;
  8. private int amount = 100;
  9. private double price = 0.01;

  10. public Test5() {
  11. }

  12. public final String getSite() {
  13. return site;
  14. }

  15. public final void setSite(final String site) {
  16. pcs.firePropertyChange("", getSite(), site);
  17. this.site = site;
  18. }

  19. public final boolean isValidated() {
  20. return validated;
  21. }

  22. public final void setValidated(final boolean validated) {
  23. pcs.firePropertyChange("validate", isValidated(), validated);
  24. this.validated = validated;
  25. }

  26. public final int getAmount() {
  27. return amount;
  28. }

  29. public final void setAmount(final int amount) {
  30. pcs.firePropertyChange("amount", getAmount(), amount);
  31. this.amount = amount;
  32. }

  33. public final double getPrice() {
  34. return price;
  35. }

  36. public final void setPrice(final double price) {
  37. pcs.firePropertyChange("price", getPrice(), price);
  38. this.price = price;
  39. }

  40. public void addPropertyChangeListener(final PropertyChangeListener l) {
  41. pcs.addPropertyChangeListener(l);
  42. }

  43. public void removePropertyChangeLister(final PropertyChangeListener l) {
  44. pcs.removePropertyChangeListener(l);
  45. }

  46. public static void main(final String[] args) {
  47. final Test5 bean = new Test5();
  48. bean.addPropertyChangeListener(new PropertyChangeListener() {

  49. @Override
  50. public void propertyChange(PropertyChangeEvent evt) {
  51. // TODO Auto-generated method stub

  52. }
  53. });
  54. bean.setAmount(200);
  55. bean.setValidated(false);
  56. bean.setSite("www.itcast.cn");
  57. bean.setPrice(10.10);

  58. }
  59. }
复制代码

作者: 杨志男    时间: 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 fireIndexedPropertyChange(String PropertyName,int index,Object oldValue,Object newValue)

4.把你的代码稍稍改了一下做个实例演示。我只注释一部分,其他的都是一个道理
  1. import java.beans.PropertyChangeEvent;

  2. import java.beans.PropertyChangeListener;

  3. import java.beans.PropertyChangeSupport;


  4. public class Test5 {

  5. private PropertyChangeSupport pcs = new PropertyChangeSupport(this);//要使用PropertyChangeSupport类,<font color="black">bean必须有一个此类的数据域。</font>
  6. private String site = "<a >www.itheima.com</a>";

  7. public Test5() {

  8. }

  9. public String getSite() {

  10. return site;

  11. }

  12. public void setSite(String newSite) {

  13. //将旧属性值进行改变
  14. String oldSite=site;
  15. site=newSite;

  16. pcs.firePropertyChange("site",oldSite,newSite);//<font color="black">将一个事件发送给所有已经注册的监听器</font>

  17. }

  18. //用这两个方法注册监视器
  19. public void addPropertyChangeListener(PropertyChangeListener l) {

  20. pcs.addPropertyChangeListener(l);

  21. }
  22. public void removePropertyChangeLister(PropertyChangeListener l) {

  23. pcs.removePropertyChangeListener(l);

  24. }

  25. public static void main(String[] args) {

  26. final Test5 bean = new Test5();
  27. bean.setSite("www.itcast.cn");
  28. bean.addPropertyChangeListener(new PropertyChangeListener() {

  29. @Override
  30. //重写类属性管理监视器的唯一方法
  31. public void propertyChange(PropertyChangeEvent evt) {

  32. //获取旧值和新值
  33. System.out.println(evt.getOldValue());
  34. System.out.println(evt.getNewValue());
  35. }

  36. });
  37. }

  38. }
复制代码
有个建议,只在需要使用final的情况下再使用它,不要处处都用






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2