↓を参考というかほとんど写経です。
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)))
}
}