快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
ener,可以使用如清单 5 所示的方式来完成此任务:

清单 5. Scala 的 Person POJO 与监听器

//This is Scala object PCL    extends java.beans.PropertyChangeListener {    override def propertyChange(pce:java.beans.PropertyChangeEvent):Unit =    {      System.out.println("Bean changed its " + pce.getPropertyName() +        " from " + pce.getOldValue() +        " to " + pce.getNewValue())    } } object App {    def main(args:Array[String]):Unit =    {      val p = new Person("Jennifer", "Aloi", 28)      p.addPropertyChangeListener(PCL)      p.setFirstName("Jenni")      p.setAge(29)      System.out.println(p)    } }

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

时间:2011-01-30 IBM Ted Neward

注意,如何使用清单 5 中的 object 实现将静态方法注册为监听器 — 而在 Java 代码中,除非显式创建并实例化 Singleton 类,否则永远无法实现。这进一步证明了一个理论:Scala 从 Java 开发的历史 痛苦 中吸取了教训。

Person 的下一步是提供 addPropertyChangeListener() 方法,并在属性更改时对各监听器触发 propertyChange() 方法调用。在 Scala 中,以可重用的方式完成此任务与定义和使用特征一样简单,如清单 6 所示。我将此特征称为 BoundPropertyBean,因为在 JavaBeans 规范中,“已通知” 的属性称为绑定属性。

清单 6. 神圣的行为重用!

//This is Scala trait BoundPropertyBean {    import java.beans._    val pcs = new PropertyChangeSupport(this)    def addPropertyChangeListener(pcl : PropertyChangeListener) =      pcs.addPropertyChangeListener(pcl)    def removePropertyChangeListener(pcl : PropertyChangeListener) =      pcs.removePropertyChangeListener(pcl)    def firePropertyChange(name : String, oldVal : _, newVal : _) : Unit =      pcs.firePropertyChange(new PropertyChangeEvent(this, name, oldVal, newVal)) }

同样,我依然要使用 java.beans 包的 PropertyChangeSupport 类,不仅因为它提供了约 60% 的实现细节,还因为我所具备的行为与直接使用它的 JavaBean/POJO 相同。对 “Support” 类的其他任何增强都将传播到我的特征。不同之处在于 Person POJO 不需要再直接使用 PropertyChangeSupport,如清单 7 所示:

清单 7. Scala 的 Person POJO,第 2 种形式

//This is Scala class Person(var firstName:String, var lastName:String, var age:Int)    extends Object    with BoundPropertyBean {    override def toString = "[Person: firstName=" + firstName +      " lastName=" + lastName + " age=" + age + "]" }

在编译后,简单查看 Person 定义即可发现它有公共方法 addPropertyChangeListener()、removePropertyChangeListener() 和 firePropertyChange(),就像 Java 版本的 Person 一样。实际上,Scala 的 Person 版本仅通过一行附加的代码即获得了这些新方法:类声明中的 with 子句将 Person 类标记为继承 BoundPropertyBean 特征。

遗憾的是,我还没有完全实现;Person 类现在支持接收、移除和通知监听器,但 Scala 为 firstName 成员生成的默认方法并没有利用它们。同样遗憾的是,这样编写的 Scala 没有很好的注释以自动地 生成利用 PropertyChangeSupport 实例的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号