プライマリコンストラクタ

Scalaではオブジェクトのコンストラクタをクラス定義自身として記述できる

class ImmutableFoo(val value:Int) 

class MutableFoo(var value:Int)

object Main extends Application {
  val immutable = new ImmutableFoo(54)
  val mutable = new MutableFoo(32)

  println("Immutable value = " + immutable.value)
  println("Mutable value = "   + mutable.value)

  mutable.value = 39
  println("Mutated Mutable value = " + mutable.value)
}

実行結果

    Immutable value = 54
    Mutable value = 32
    Mutated Mutable value = 39

プライマリコンストラクタのパラメータ定義には val とvar が指定できます。

  • val で定義すると、暗黙的にアクセサーメソッドが定義される
  • var で定義すると、ミューテータ(中身を変化させる)メソッドが定義される

これらのアクセッサとミューテータは、Javaのpublicフィールドとしてアクセスできます。

サブクラス化

サブクラス化した場合に、親クラスのコンストラクタにパラメータを引き渡すのは以下のようになります。

class Mammal(name:String) {
  override def toString() = "Mammal named " + name
}

class Dog(name:String) extends Mammal(name) {
  def speak() = println(this.toString + " says Woof")
}  

object Main extends Application {
  var rinTinTin = new Dog("Rin Tin Tin")
  rinTinTin.speak
}

実行結果

    Mammal named Rin Tin Tin says Woof.

セカンダリコンストラクタの定義

セカンダリコンストラクタはthisメソッドにより定義できます。

class AbsoluteNumber(num:Int) {
    var value = Math.abs(num)
    
    def this(dbl:Double) = this(dbl.toInt)
}

セカンダリコンストラクタのパラメータは、オブジェクトのプロパティとはなりません。