强制可以为类成员分配值:Scala

时间:2016-04-20 23:29:23

标签: scala

我打算限制我的类的字符串成员可以采用的值。例如:对于一个名为country的成员,只有允许的值应该是我定义的国家,如'US',UK,CN等。这个常量需要是字符串常量。

我想过使用Enum,但这并没有给我灵活的String常量。或者我可能不知道如何使用它。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

枚举有什么问题?似乎非常适合您的需求。这是一个例子:

object Country extends Enumeration {
  val US = Value("United States")
  val UK = Value("United Kingdom")
}

case class MemberCountry(country: Country.Value)

//example instantiation
MemberCountry(Country.UK)
MemberCountry(Country.withName("United States"))

答案 1 :(得分:1)

在Scala中,Enum支持并不是那么好。首先,scala的内置Enumeration是垃圾,不要使用它。

枚举的常用方法是密封特征/类:

sealed abstract class Country(val name:String)

object Country {
  case object US extends Country("US")
  case object UK extends Country("UK")
  case object CN extends Country("CN")

  val values = Set(US, UK, CN)
}

Country.values.find(_.name == "US")

它有一个问题,如果你想要所有可能值的列表,你需要自己枚举它们(上例中的values字段)。

但是,有一些替代方案可以解决这个问题。 您可以使用宏(check this thread)。

或使用第三方library

答案 2 :(得分:0)

枚举在Scala中有其优点和缺点。 您可以使用上面强调的任何方法:

  • 枚举子类
  • 使用密封特性/类别。

这两种方法都有好处和潜在的权衡。关于这个问题的这篇内容丰富的文章可能值得一读: http://underscore.io/blog/posts/2014/09/03/enumerations.html