面向Java开发人员的Scala指南 - 类操作 - 编程入门网
中的第一行:
清单 3. Scala 的默认构造函数
您也许会认为清单 3 中使用了某种类似于泛型的语法,这其实是 Rational 类的默认的、首选的构造函数:n 和 d 是构造函数的参数。 Scala 优先使用单个构造函数,这具有一定的意义 —— 大多数类只有一个构造函数,或者通过一个构造函数将一组构造函数 “链接” 起来。如果需要,可以在一个 Rational 上定义更多的构造函数,例如: 清单 4. 构造函数链
注意,Scala 的构造函数链通过调用首选构造函数(Int,Int 版本)实现 Java 构造函数链的功能。 实现细节 在处理有理数时,采取一点数值技巧将会有所帮助:也就是说,找到公分母,使某些操作变得更容易。如果要将 1/2 与 2/4 相加,那么 Rational 类应该足够聪明,能够认识到 2/4 和 1/2 是相等的,并在将这两个数相加之前进行相应的转换。 嵌套的私有 gcd() 函数和 Rational 类中的 g 值可以实现这样的功能。在 Scala 中调用构造函数时,将对整个类进行计算,这意味着将 g 初始化为 n 和 d 的最大公分母,然后用它依次设置 n 和 d。 回顾一下 清单 1 就会发现,我创建了一个覆盖的 toString 方法来返回 Rational 的值,在 RunRational 驱动程序代码中使用 toString 时,这样做非常有用。 然而,请注意 toString 的语法:定义前面的 override 关键字是必需的,这样 Scala 才能确认基类中存在相应的定义。这有助于预防因意外的输入错误导致难于觉察的 bug(Java 5 中创建 @Override 注释的动机也在于此)。还应注意,这里没有指定返回类型 —— 从方法体的定义很容易看出 —— 返回值没有用 return 关键字显式地标注,而在 Java 中则必须这样做。相反,函数中的最后一个值将被隐式地当作返回值(但是,如果您更喜欢 Java 语法,也可以使用 return 关键字)。 一些重要值 接下来分别是 numer 和 denom 的定义。这里涉及的语法可能让 Java 程序员认为 numer 和 denom 是公共的 Int 字段,它们分别被初始化为 n-over-g 和 d-over-g;但这种想法是不对的。 在形式上,Scala 调用无参数的 numer 和 denom 方法,这种方法用于创建快捷的语法以定义 accessor。Rational 类仍然有 3 个私有字段:n、d 和 g,但是,其中的 n 和 d 被默认定义为私有访问,而 g 则被显式地定义为私有访问,它们对于外部都是隐藏的。 此时,Java 程序员可能会问:“n 和 d 各自的 ‘setter’ 在哪里?” Scala 中不存在这样的 setter。Scala 的一个强大之处就在于,它鼓励开发人员以默认方式创建不可改变的对象。但是,也可使用语法创建修改 Rational 内部结构的方法,但是这样做会破坏该类固有的线程安全性。因此,至少对于这个例子而言,我将保持 Rational 不变。 当然还有一个问题,如何操纵 Rational 呢?与 java.lang.String 一样,不能直接修改现有的 Rational 的值,所以惟一的办法是根据现有类的值创建一个新的 Rational,或者从头创建。这涉及到 4 个名称比较古怪的方法:+、 -、* 和 /。 与其外表相反,这并非操作符重载。 面向Java开发人员的Scala指南 - 类操作(3)时间:2011-01-30 IBM Ted Neward操作符 记住,在 Scala 中一切都是对象。在上一篇 文章 中, 您看到了函数本身也是对象这一原则的应用,这使 Scala 程序员可以将函数赋予变量,将函数作为对象参数传递等等。另一个同样重要的原则是,一切都是函数;也就是说,在此处,命名为 add 的函数与命名为 + 的函数没有区别。在 Scala 中,所有操作符都是类的函数。只不过它们的名称比较古怪罢了。 在 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |