是否有文件明确提到具有案例对象的密封特征是否优于枚举?我个人没有任何真正的意见/偏好,但希望根据最佳/推荐的做法获得更好的信息。
我没有找到任何关于此问题的SOF问题,但如果存在一个答案可靠,请随时在此标记。
答案 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 free。 Enumeration
值具有String
名称,其中包含一组可以迭代的名称,并且它们具有排序。如果这些事情对你很重要,那么也许这就是你所需要的。
因此,如果您要对值进行模式匹配,请使用密封特征。如果您要迭代这些值或按名称查找它们,可以使用Enumeration
。
(就我个人而言,我认为我没有理由使用Enumeration
,而是使用YMMV。)