基本enumerations
很笨拙:
- 如果你想在模式匹配使用它們,你會編譯器看不到下一個警告「匹配可能不完全」而且你可以意外地面對
scala.MatchError
在肆意我。
- 它們與Java的枚舉不兼容 - 如果您不支持Java的API,那麼它不是很可怕,但如果您這樣做了,它可能會給您帶來意想不到的失望。
由於擦除後相同類型的枚舉,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