快速业务通道

面向Java开发人员的Scala指南 - 关于特征和行为 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
private int age;    public Person(String fn, String ln, int a)    {      lastName = ln; firstName = fn; age = a;    }    public String getFirstName() { return firstName; }    public void setFirstName(String v) { firstName = v; }    public String getLastName() { return lastName; }    public void setLastName(String v) { lastName = v; }    public int getAge() { return age; }    public void setAge(int v) { age = v; } }

面向Java开发人员的Scala指南 - 关于特征和行为(2)

时间:2011-01-30 IBM Ted Neward

这些代码看起来非常简单,编写起来也不难。但如果您希望提供通知支持 — 使第三方能够使用 POJO 注册并在变更属性时接收回调,事情会怎样?根据 JavaBeans 规范,必须实现 PropertyChangeListener 接口以及它的一个方法 propertyChange()。如果您希望允许任何 POJO 的 PropertyChangeListener 都能够对属性更改 “投票”,那么 POJO 就需要实现 VetoableChangeListener 接口,该接口的实现又依赖于 vetoableChange() 方法的实现。

至少,事情应该是这样运作的。

实际上,希望成为属性变更通知接收者的用户必须实现 PropertyChangeListener 接口,发送者(本例中的 Person 类)必须提供接收该接口实例的公共方法和监听器需要监听的属性名称。最终得到更加复杂的 Person,如清单 2 所示:

清单 2. Person POJO,第 2 种形式

//This is Java public class Person {    // rest as before, except that inside each setter we have to do something    // like:    // public setFoo(T newValue)    // {    //   T oldValue = foo;    //   foo = newValue;    //   pcs.firePropertyChange("foo", oldValue, newValue);    // }    public void addPropertyChangeListener(PropertyChangeListener pcl)    {      // keep a reference to pcl    }    public void removePropertyChangeListener(PropertyChangeListener pcl)    {      // find the reference to pcl and remove it    } }

保持引用属性变更监听器意味着 Person POJO 必须保留某种类型的集合类(例如 ArrayList)来包含所有引用。然后必须实例化、插入并移除 POJO — 由于这些操作不是原子操作,因此还必须包含恰当的同步保护。

最后,如果某个属性发生变化,属性监听器列表必须得到通知,通常通过遍历 PropertyChangeListener 的集合并对各元素调用 propertyChange() 来实现。此过程包括传入新的 PropertyChangeEvent 描述属性、原有值和新值,这是 PropertyChangeEvent 类和 JavaBeans 规范的要求。

在我们编写的 POJO 中,只有少数支持监听器通知,这并不意外。在这里要完成大量工作,必须手动地重复处理所创建的每一个 JavaBean/POJO。

除了工作还是工作 — 变通方法在哪里?

有趣的是,C++ 对于私有继承的支持在 Java 语言中得到了延续,今天,我们用它来解决 JavaBeans 规范的难题。一个基类为 POJO 提供了基本 add() 和 remove() 方法、集合类以及 “firePropertyChanged()” 方法,用于通知监听器属性变更。

我们仍然可以通过 Java 类完成,但由于 Java 缺乏私有继承,Person 类必须继承 Bean 基类,从而可向上转换 到 Bean。这妨碍了 Person 继承其他类。多重继承可能使我们不必处理后续的问题,但它也重新将我们引向了虚拟继承,而这是绝对要避免的。

针对这个问题的 Java 语言解决方案是运用众所周知的支持 类,在本例中是 PropertyChangeSupport:实例化 POJO 中的一个类,为 PO

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号