快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
pertyChangeListener); public final void pcs_$eq(java.beans.PropertyChangeSupport); public final java.beans.PropertyChangeSupport pcs(); }

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

时间:2011-01-30 IBM Ted Neward

请注意 Person 的类声明。该 POJO 实现了一个名为 BoundPropertyBean 的接口,这就是特征作为接口映射到 JVM 本身的方法。但特征方法的实现又是什么样的呢?请记住,编译器可以容纳所有技巧,只要最终结果符合 Scala 语言的语义含义即可。在这种情况下,它会将特征中定义的方法实现和字段声明纳入实现特征的类 Person 中。使用 -private 运行 javap 会使这更加显著 — 如果 javap 输出的最后两行体现的还不够明显(引用特征中定义的 pcs 值):

清单 12. Person 内幕,第 2 种形式

$ javap -private -classpath C:\Prg\scala-2.7.0-final\lib\scala-library.jar;classes Person Compiled from "Person.scala" public class Person extends java.lang.Object implements BoundPropertyBean,scala. ScalaObject{    private final java.beans.PropertyChangeSupport pcs;    private int age;    private java.lang.String lastName;    private java.lang.String firstName;    public Person(java.lang.String, java.lang.String, int);    public java.lang.String toString();    public void setAge(int);    public void setLastName(java.lang.String);    public void setFirstName(java.lang.String);    public void age_$eq(int);    public int age();    public void lastName_$eq(java.lang.String);    public java.lang.String lastName();    public void firstName_$eq(java.lang.String);    public java.lang.String firstName();    public int $tag();    public void firePropertyChange(java.lang.String, java.lang.Object, java.lang.Object);    public void removePropertyChangeListener(java.beans.PropertyChangeListener);    public void addPropertyChangeListener(java.beans.PropertyChangeListener);    public final void pcs_$eq(java.beans.PropertyChangeSupport);    public final java.beans.PropertyChangeSupport pcs(); }

实际上,这个解释也回答了为何可以推迟特征方法的执行,直至用该检查的时候。因为在类实现特征的方法之前,它实际上并不是任何类的一 “部分”,因此编译器可将方法的某些逻辑方面留到以后再处理。这非常有用,因为它允许特征在不了解实现特征的实际基类将是什么的情况下调用 super()。

关于特征的备注

在 BoundPropertyBean 中,我在 PropertyChangeSupport 实例的构建中使用了特征功能。其构造方法需要属性得到通知的 bean,在早先定义的特征中,我传入了 “this”。由于在 Person 上实现之前并不会真正定义特征,“this” 将引用 Person 实例,而不是 BoundPropertyBean 特征本身。特征的这个具体方面 — 定义的推迟解析 — 非常微妙,但对于此类的 “迟绑定” 来说可能非常强大。

对于 Application 特征的情况,有两部分很有魔力;Application 特征的 main() 方法为 Java 应用程序提供普适入口点,还会检查 -Dscala.time 系统属性,查看是否应该跟踪执行时间。但由于 Application 是一个特征,方法实际上会在子类上出现(App)。要执行此方法,必须创建 App 单体,也就是说构造 App 的一个实例,“处理” 类的主体,这将有效地执行应用程序。只有在这种处理完成之后,特征

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