如何在Scala中创建具有封闭值集的自己的类型

时间:2015-02-07 21:14:57

标签: scala

我尝试将以下特征混合到我的课程中,以享受类似于Boolean类型的行为。

trait ReadyStates { // well, this is really used like an enumeration
  class ReadyState
  object Ready extends ReadyState 
  object NotReady extends ReadyState
}

然而,这不起作用,因为这个特性被混入的每个类都会创建自己的对象。因此,当在不同类的成员之间传递返回值时,Ready无法与Ready进行天真的比较。

如何获得自定义类型,它具有自己的一组允许值,与布尔值truefalse相同,并且可以跨类无缝比较它们?

我看了一下枚举,当时它们看起来并不那么闪亮。

谢谢!

2 个答案:

答案 0 :(得分:5)

受到@ m-z评论的启发,我最终使用了:

sealed abstract class ReadyState
object Ready extends ReadyState 
object NotReady extends ReadyState

没有任何包装器对象。简单。

答案 1 :(得分:3)

为了进一步扩展亚特的答案,我通常会这样做:

sealed trait ReadyState
object ReadyState {
  case object Ready extends ReadyState
  case object NotReady extends ReadyState
}

在配对对象ReadyState中包装案例对象可避免命名空间污染。例如,现在你可以有另一个ADT,比如

sealed trait AnotherState
object AnotherState {
  case object Ready extends AnotherState
  case object NotReady extends AnotherState
}

ReadyNotReady名称不会发生冲突,因为他们已经命名为"名称空间"根据各自的目标。

此外,使用case objects(或类)允许编译器检查穷举匹配。