我尝试将以下特征混合到我的课程中,以享受类似于Boolean
类型的行为。
trait ReadyStates { // well, this is really used like an enumeration
class ReadyState
object Ready extends ReadyState
object NotReady extends ReadyState
}
然而,这不起作用,因为这个特性被混入的每个类都会创建自己的对象。因此,当在不同类的成员之间传递返回值时,Ready
无法与Ready
进行天真的比较。
如何获得自定义类型,它具有自己的一组允许值,与布尔值true
和false
相同,并且可以跨类无缝比较它们?
我看了一下枚举,当时它们看起来并不那么闪亮。
谢谢!
答案 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
}
Ready
和NotReady
名称不会发生冲突,因为他们已经命名为"名称空间"根据各自的目标。
此外,使用case objects
(或类)允许编译器检查穷举匹配。