是否在scala中推荐了枚举(vs包括特征/案例对象的替代品)?

时间:2014-09-29 04:45:28

标签: scala

是否有文件明确提到具有案例对象的密封特征是否优于枚举?我个人没有任何真正的意见/偏好,但希望根据最佳/推荐的做法获得更好的信息。

我没有找到任何关于此问题的SOF问题,但如果存在一个答案可靠,请随时在此标记。

1 个答案:

答案 0 :(得分:3)

我认为这取决于你将要做什么。密封特性在编译时有所帮助,但Enumeration在运行时有更多帮助。

关于密封特征的一件大事就是你得到了非穷举匹配的编译器警告。

sealed trait Animal
object Cat extends Animal
object Dog extends Animal

def foo(a: Animal) = a match {
  case Cat => "cat"
}

Warning:(7, 26) match may not be exhaustive.
It would fail on the following input: Dog
    def foo(a: Animal) = a match {
                         ^

在相应的Enumeration版本中,你没有这个,所以这个错误在没有警告的情况下编译:

object Animal extends Enumeration {
  type Animal = Value
  val Cat, Dog = Value
}
import Animal._

(Dog: Animal) match {
  case Cat => "cat"
}

但是,当然,仅仅通过查看API,您知道some stuff that Enumeration gives you for freeEnumeration值具有String名称,其中包含一组可以迭代的名称,并且它们具有排序。如果这些事情对你很重要,那么也许这就是你所需要的。

因此,如果您要对值进行模式匹配,请使用密封特征。如果您要迭代这些值或按名称查找它们,可以使用Enumeration

(就我个人而言,我认为我没有理由使用Enumeration,而是使用YMMV。)