Scala的从构造器:主构造器之外的构造器

开发 后端
本文节选自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻译的《Programming in Scala》的第六章。Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言。

有些时候一个类里需要多个构造器。Scala里主构造器之外的构造器被称为从构造器:auxiliary constructor。比方说,分母为1的分数只写分子的话就更为简洁。如,对于5/1 来说,可以只是写成5。因此,如果不是写成Rational(5, 1),客户程序员简单地写成Rational(5)或许会更好看一些。这就需要给Rational添加一个只带一个参数,分子的从构造器并预先设定分母为1。代码6.2展示了应该有的样子。

51CTO编辑推荐:Scala编程语言专题

  1. class Rational(n: Int, d: Int) {  
  2.  require(d != 0)  
  3.  val numer: Int = n  
  4.  val denom: Int = d  
  5.  def this(n: Int) = this(n, 1)  
  6.  override def toString = numer+"/"+denom  
  7.  def add(that: Rational): Rational =  
  8.   new Rational(  
  9.    numer * that.denom + that.numer * denom,  
  10.    denom * that.denom  
  11.   )  
  12. }  
代码 6.2 带有从构造器的Rational

Scala的从构造器开始于def this(...)。Rational的从构造器主体几乎完全是调用主构造器,直接传递了它的唯一的参数,n,作为分子和1作为分母。输入下列代码到解释器里可以实际看到从构造器的效果:

  1. scala> val y = new Rational(3)  
  2. y: Rational = 3/1 
Scala里的每一个从构造器的第一个动作都是调用同一个类里面其他的构造器。换句话说就是,每个Scala类里的每个从构造器都是以“this(...)”形式开头的。被调用的构造器既可以是主构造器(好像Rational这个例子),也可以是从文本上来看早于调用构造器的其它从构造器。这个规则的根本结果就是每一个Scala的构造器调用终将结束于对类的主构造器的调用。因此主构造器是类的唯一入口点。

注意

若你熟悉Java,你或许会奇怪为什么Scala构造器的规矩比Java的还要大。Java里,构造器的第一个动作必须要么调用同类里的另一个构造器,要么直接调用超类的构造器。Scala的类里面,只有主构造器可以调用超类的构造器。Scala里更严格的限制实际上是权衡了更高的简洁度和与Java构造器相比的简易性所付出的代价之后作出的设计。

【相关阅读】

  1. 在Scala中检查先决条件、添加字段和自指向
  2. Scala Rational对象的toString方法
  3. 学习Scala中的Rational类:分数的模型化
  4. Scala中的富包装器:富操作和富类列表
  5. Scala操作符的优先级和关联性

责任编辑:book05 来源: Artima
相关推荐

2012-05-16 13:45:24

Java构造器

2009-07-17 17:41:41

SwingWorker

2011-05-16 10:35:02

jQuery

2019-10-22 08:45:07

Java构造器编程语言

2009-07-22 08:45:35

Scala超类构造器override修饰符

2012-02-27 14:09:00

Java

2022-04-15 08:30:00

Lombok@Builde构建器

2009-10-12 13:32:58

VB.NET线程构造器

2010-01-18 10:28:15

C++编译器

2009-12-17 10:18:17

Ruby创建构造器

2013-05-06 09:59:48

2009-12-11 10:42:00

Scala讲座类定义构造函数

2009-08-27 10:06:15

Scala的构造方法

2019-09-02 08:39:02

路由器RAM内存

2016-09-02 09:14:26

2009-11-02 16:30:29

VB.NET构造器

2009-09-02 17:24:39

C#构造POP3服务器

2021-08-19 09:59:07

Spring代码Java

2021-06-27 21:06:47

开发循环依赖

2021-11-25 19:26:23

服务器
点赞
收藏

51CTO技术栈公众号