Posted at

【Scala】複数コンストラクタ【オーバーロード】

More than 5 years have passed since last update.

↓を参考というかほとんど写経です。

http://seratch.hatenablog.jp/entry/20110428/1303999721 

Javaではおなじみの複数の引数をとる(オーバーロード)コンストラクタを定義してみましょう。


キーワード


  • 補助コンストラクタ(auxiliary constructor)


実践


パターン:引数の省略(デフォルト値)

複数のコンストラクタを定義したいPersonクラスを用意します。

class Person(name: String, sex: String) {

}

もう一つコンストラクタを用意します。


class Person(name: String, sex: String) {
def this(name: String) = {
this(name, "woman")
}
}

まあこの場合なら、

class Person(name: String, sex: String = "woman") {

}

これ(デフォルト引数)でも同様ですね。


パターン:違う型(型変換)

通常のコンストラクタ

class Person(name: String, specialAbility: Map[String]) {

}

割と単純な例ですが、もう一つコンストラクタを用意します。

class Person(name: String, specialAbility: Map[String, String]) {

def this(name: String, specialAbilityList:List[(String, String)]) = {
this(name, specialAbilityList.toMap)
}
}


ポイント


  • サブで定義したコンストラクタは、必ずメインのコンストラクタ(メインの宣言の部分)のコンストラクタを通る。

  • ↑の特性のため、実利用時のポイントとしては、メインのコンストラクタはなるべくおおざっぱなもの(大は小を兼ねる的な)にしておき、サブのコンストラクタで細分化するようなイメージか。

サブコンストラクタでの細分化例

class Person(elems: List[Map[String, String]]) {

def this(singleMap: Map[String, String]) = {
this(List(singleMap))
}

def this(mapKey: String, mapValue: String) = {
this(List(Map(mapKey -> mapValue)))
}
}