快速业务通道

面向Java开发人员的Scala指南 - 类操作 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
ational $plus(Rational); public int denom(); public int numer(); private int g(); private int gcd(int, int); public Rational(int); public int $tag(); } C:\Projects\scala-classes\code>

Scala 类中定义的 “操作符” 被转换成传统 Java 编程中的方法调用,不过它们仍使用看上去有些古怪的名称。类中定义了两个构造函数:一个构造函数带有一个 int 参数,另一个带有两个 int 参数。您可能会注意到,大写的 Int 类型与 java.lang.Integer 有点相似,Scala 编译器非常聪明,会在类定义中将它们转换成常规的 Java 原语 int。

测试 Rational 类

一种著名的观点认为,优秀的程序员编写代码,伟大的程序员编写测试;到目前为止,我还没有对我的 Scala 代码严格地实践这一规则,那么现在看看将这个 Rational 类放入一个传统的 JUnit 测试套件中会怎样,如清单 10 所示:

清单 10. RationalTest.java

import org.junit.*; import static org.junit.Assert.*; public class RationalTest {    @Test public void test2ArgRationalConstructor()    {      Rational r = new Rational(2, 5);      assertTrue(r.numer() == 2);      assertTrue(r.denom() == 5);    }    @Test public void test1ArgRationalConstructor()    {      Rational r = new Rational(5);      assertTrue(r.numer() == 0);      assertTrue(r.denom() == 1);        // 1 because of gcd() invocation during construction;        // 0-over-5 is the same as 0-over-1    }      @Test public void testAddRationals()    {      Rational r1 = new Rational(2, 5);      Rational r2 = new Rational(1, 3);      Rational r3 = (Rational) reflectInvoke(r1, "$plus", r2); //r1.$plus(r2);      assertTrue(r3.numer() == 11);      assertTrue(r3.denom() == 15);    }    // ... some details omitted }

面向Java开发人员的Scala指南 - 类操作(5)

时间:2011-01-30 IBM Ted Neward

除了确认 Rational 类运行正常之外,上面的测试套件还证明可以从 Java 代码中调用 Scala 代码(尽管在操作符方面有点不匹配)。当然,令人高兴的是,您可以将 Java 类迁移至 Scala 类,同时不必更改支持这些类的测试,然后慢慢尝试 Scala。

您惟一可能觉得古怪的地方是操作符调用,在本例中就是 Rational 类中的 + 方法。回顾一下 javap 的输出,Scala 显然已经将 + 函数转换为 JVM 方法 $plus,但是 Java 语言规范并不允许标识符中出现 $ 字符(这正是它被用于嵌套和匿名嵌套类名称中的原因)。

为了调用那些方法,需要用 Groovy 或 JRuby(或者其他对 $ 字符没有限制的语言)编写测试,或者编写 Reflection 代码来调用它。我采用后一种方法,从 Scala 的角度看这不是那么有趣,但是如果您有兴趣的话,可以看看本文的代码中包含的结果(参见 下载)。

注意,只有当函数名称不是合法的 Java 标识符时才需要用这类方法。

“更好的” Java

我学习 C++ 的时候,Bjarne Stroustrup 建议,学习 C++ 的一种方法是将它看作 “更好的 C 语言”(参见 参考资料)。在某些方面,如今的 Java 开发人员也可以将 Scala 看作是 “更好的 Java”,因为它提供了一种编写传统 Java POJO 的更简洁的方式。考虑清单 11 中显示的传统 Person POJO:

清单 11. JavaPerson.java(原始 POJO)

public class JavaPerson {    public JavaPerson(String firstName, String lastName, int age)    {  

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