Java类具有可以带参数的构造器,而Scala类可以直接带参数。Scala的写法更简洁——类参数可以直接在类的主体中使用;没必要定义字段然后写赋值函数把构造器的参数复制到字段里。这可以潜在地节省很多固定写法,尤其是对小类来说。
Scala编译器将把你放在类内部的任何不是字段的部分或者方法定义的代码,编译进主构造器。例如,你可以像这样打印输出一条除错消息:
class Rational(n: Int, d: Int) { println("Created "+n+"/"+d) }
根据这个代码,Scala编译器将把println调用放在Rational的主构造器。因此,println调用将在每次创建一个新的Rational实例时打印这条除错信息。
使用require方法对参数进行先决条件检测
class Rational(n: Int, d: Int) { require(d != 0) override def toString = n +"/"+ d }
require方法带一个布尔型参数。如果传入的值为真,require将正常返回。反之,require将通过抛出IllegalArgumentException来阻止对象被构造。
从构造器,Scala的从构造器开始于def this(...)。每一个从构造器的第一个动作都是调用同一个类里面其他的构造器。换句话说就是,每个Scala类里的每个从构造器都是以“this(...)”形式开头的。
若你熟悉Java,你或许会奇怪为什么Scala构造器的规矩比Java的还要大。Java里,构造器的第一个动作必须要么调用同类里的另一个构造器,要么直接调用超类的构造器。Scala的类里面,只有主构造器可以调用超类的构造器。Scala里更严格的限制实际上是权衡了更高的简洁度和与Java构造器相比的简易性所付出的代价之后作出的设计。