Basic enumerations
в Scala
неуклюж:
- Если вы хотите использовать их в сопоставлении с образцом, вы будете не видеть следующее предупреждение компилятором «матч не может быть исчерпывающим», и вы можете неожиданно столкнуться с
scala.MatchError
в рунете IME.
- Они не совместимы с перечислением Java - это не очень страшно, если вы не поддерживаете API для Java, но если вы это сделаете, это может стать неожиданным разочарованием для вас.
Перегрузка с перечислениями Scala, не работающими в связи с фактом того же типа перечислений после стирания. Таким образом, следующий код снимок не является действительным:
object WeekDays extends Enumeration {
val Mon, Tue, Wed, Thu, Fri = Value
}
object WeekEnds extends Enumeration {
val Sat, Sun = Value
}
object DaysOperations {
def f(x: WeekEnds.Value) = "That's a weekend"
def f(x: WeekDays.Value) = "That's a weekday"
}
Он будет бросать error: double definition: have the same type after erasure: (x: Enumeration#Value)String
. Как вы видите, scala.Enumeration
не является удобным и предпочитает не использовать его, это сделает вашу жизнь проще.
Правильные подходы: Правильный подход использует комбинацию case object
или object
с sealed
класса:
object WeekDays {
sealed trait EnumVal
case object Mon extends EnumVal
case object Tue extends EnumVal
case object Wed extends EnumVal
case object Thu extends EnumVal
case object Fri extends EnumVal
val daysOfWeek = Seq(Mon, Tue, Wed, Thu, Fri)
}
Кроме того, вы можете не использовать wrapper object
для перечисления:
sealed trait Day { def description: String }
case object Monday extends Day { val description = "monday is awful" }
Использование сторонней библиотеки - Enumeratum также может решить проблему scala.enumeration
, это безопасная и мощная реализация перечислений, простая в использовании и понятная.
libraryDependencies ++= Seq(
"com.beachape" %% "enumeratum" % enumeratumVersion
)
import enumeratum._
sealed trait Day extends EnumEntry
object Greeting extends Enum[Greeting] {
val values = findValues
case object Mon extends Day
case object Tue extends Day
case object Wed extends Day
case object Thu extends Day
case object Fri extends Day
}
Спасибо! Но это в основном тот же код, что и я. В вашем примере пока еще нет способа сопоставить строку с соответствующим объектом case. – Tomer
Это, например: '' 'ProgressStatus (" ACCEPTED ")' '' соответствует '' 'ProgressStatus.ACCEPTED''' –
Приятный подход !!! – Dani