Scala的從構造器:主構造器之外的構造器
有些時候一個類里需要多個構造器。Scala里主構造器之外的構造器被稱為從構造器:auxiliary constructor。比方說,分母為1的分數(shù)只寫分子的話就更為簡潔。如,對于 來說,可以只是寫成5。因此,如果不是寫成Rational(5, 1),客戶程序員簡單地寫成Rational(5)或許會更好看一些。這就需要給Rational添加一個只帶一個參數(shù),分子的從構造器并預先設定分母為1。代碼6.2展示了應該有的樣子。
51CTO編輯推薦:Scala編程語言專題
代碼 6.2 帶有從構造器的Rational
- class Rational(n: Int, d: Int) {
- require(d != 0)
- val numer: Int = n
- val denom: Int = d
- def this(n: Int) = this(n, 1)
- override def toString = numer+"/"+denom
- def add(that: Rational): Rational =
- new Rational(
- numer * that.denom + that.numer * denom,
- denom * that.denom
- )
- }
Scala的從構造器開始于def this(...)。Rational的從構造器主體幾乎完全是調用主構造器,直接傳遞了它的唯一的參數(shù),n,作為分子和1作為分母。輸入下列代碼到解釋器里可以實際看到從構造器的效果:
Scala里的每一個從構造器的第一個動作都是調用同一個類里面其他的構造器。換句話說就是,每個Scala類里的每個從構造器都是以“this(...)”形式開頭的。被調用的構造器既可以是主構造器(好像Rational這個例子),也可以是從文本上來看早于調用構造器的其它從構造器。這個規(guī)則的根本結果就是每一個Scala的構造器調用終將結束于對類的主構造器的調用。因此主構造器是類的唯一入口點。
- scala> val y = new Rational(3)
- y: Rational = 3/1
注意
若你熟悉Java,你或許會奇怪為什么Scala構造器的規(guī)矩比Java的還要大。Java里,構造器的第一個動作必須要么調用同類里的另一個構造器,要么直接調用超類的構造器。Scala的類里面,只有主構造器可以調用超類的構造器。Scala里更嚴格的限制實際上是權衡了更高的簡潔度和與Java構造器相比的簡易性所付出的代價之后作出的設計。
【相關閱讀】
- 在Scala中檢查先決條件、添加字段和自指向
- Scala Rational對象的toString方法
- 學習Scala中的Rational類:分數(shù)的模型化
- Scala中的富包裝器:富操作和富類列表
- Scala操作符的優(yōu)先級和關聯(lián)性