Scala 2 での enum

  • Scala 2 には予約語としての enum はありません
  • Enumeration が準備されていますが、一般的には利用されていません
  • 他の言語での enum の代用として Scala では case classcase object を使います

case object を使う

  • 基底(enum の型)になるクラスを sealed trait で作ります。
  • enum のメンバーとして、それを継承する final case object を作ります。
sealed trait Color

final case object Black extends Color
final case object White extends Color

利用時には match を使います。

color match {
    case Black => ...
    case White => ...
}

case class を使う

  • case object の他にも、case class を使うこともできます。
  • case classcase object と違い、パターンマッチに使える値を持つことができます。
sealed trait Color

final case class Rgb(r: Int, g: Int, b: Int) extends Color
final case class Hsl(h: Int, s: Int, l: Int) extends Color

color match {
    case Rgb(r, g, b) => ...
    case Hsl(h, s, l) => ...
}

case objectcase class を混ぜる

  • enum のメンバーは、case objectcase class を混ぜることができます。
  • enum の中に更にパラメータがある場合は case class、無い場合は case object を使います。
sealed trait Color


final case object Black extends Color
final case object White extends Color

final case class Rgb(r: Int, g: Int, b: Int) extends Color
final case class Hsl(h: Int, s: Int, l: Int) extends Color


color match {
    case Black => ...
    case White => ...
    case Rgb(r, g, b) => ...
    case Hsl(h, s, l) => ...
}

参考資料