7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?