如何使用Enum在Scala中建模全局常量?

时间:2016-07-25 22:39:34

标签: scala

我有一个字符串的枚举,它来自查询到数据库的结果。

换句话说,我正在查询数据库中的事件,其中一个属性是事件描述,它应该始终属于一组众所周知的字符串。例如。

  1. “PreferedLabelAdded”
  2. “PreferedLabelChanged”
  3. 等等。

    我想在Scala中建模来自数据库的可能字符串。我正在考虑使用Enum,但我不知道我在网上看到了什么。

    最终,我想要做的是将属性的值与此值之一进行比较,以根据事件描述的类型执行某些任务。

    Alghough我可以去,只需输入我的魔法字符串

    if (eventDesc == "PreferedLabelAdded")
    

    我发现它很糟糕,因为没有一个接触点来改变这些字符串,而是它遍布整个代码。

    也许只是简单地使用Object

    Object EventDesc {
    
    val PrefAdded = "PreferedLabelAdded""
    val PrefChanged = "...." 
    
    }
    

    如果有人对此有一些具体的建议,那就太好了。

    丹尼尔

1 个答案:

答案 0 :(得分:1)

您可以扩展scala.Enumeration类来创建枚举:

object EventDesc extends Enumeration {
    type EventDesc = Value
    val PreferedLabelAdded, PreferedLabelChanged, UNKNOWN = Value
}

val eventDesc = EventDesc.withName("PreferedLabelAdded")

if (eventDesc == EventDesc.PreferedLabelChanged) {
  Console.println(eventDesc)
}

您也可以进行模式匹配:

eventDesc match {
  case PreferedLabelAdded | PreferedLabelChanged       => handleEvent(context)
  case UNKNOWN                   => ignoreEvent(context)
  case _                          => // noop
}