快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
get/set 方法,因此我必须自行编写,如清单 8 所示:

清单 8. Scala 的 Person POJO,第 3 种形式

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

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

时间:2011-01-30 IBM Ted Neward

应该具备的出色特征

特征不是一种函数编程 概念,而是十多年来反思对象编程的结果。实际上,您很有可能正在简单的 Scala 程序中使用以下特征,只是没有意识到而已:

清单 9. 再见,糟糕的 main()!

//This is Scala object App extends Application {    val p = new Person("Jennifer", "Aloi", 29)    p.addPropertyChangeListener(PCL)    p.setFirstName("Jenni")    p.setAge(30)    System.out.println(p) }

Application 特征定义了一直都是手动定义的 main() 的方法。实际上,它包含一个有用的小工具:计时器,如果系统属性 scala.time 传递给了 Application 实现代码,它将为应用程序的执行计时,如清单 10 所示:

清单 10. 时间就是一切

$ scala -Dscala.time App Bean changed its firstName from Jennifer to Jenni Bean changed its age from 29 to 30 [Person: firstName=Jenni lastName=Aloi age=30] [total 15ms]

JVM 中的特征

任何足够高级的技术都近乎魔术。

— Arthur C Clarke

在这个时候,有必要提出这样一个问题,这种看似魔术的接口与方法结构(即 特征)是如何映射到 JVM 的。在清单 11 中,我们的好朋友 javap 展示了魔术背后发生了什么:

清单 11. Person 内幕

$ javap -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{
    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.Pro

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