我最近在Scala中遇到了以下代码模式:
sealed trait ConfirmAction
object ConfirmAction {
final case object NewGame extends ConfirmAction
final case object Quit extends ConfirmAction
}
我理解这将ConfirmAction密封trait的子类型定义为伴随对象中的case对象。不过,我对几件事很好奇:
1.为什么case对象NewGame和Quit被标记为final?这是不是多余的,因为case对象本质上是单例的,不能扩展?
1.选择这种在伴随对象中定义子类型的模式,而不是直接在密封的trait本身下声明子类型,有没有特定的原因,比如:
sealed trait ConfirmAction
final case object NewGame extends ConfirmAction
final case object Quit extends ConfirmAction
此外,我想更多地了解这种方法及其好处。您能解释一下这些选择背后的基本原理吗?并向我指出一些资源,在那里我可以了解更多关于这种声明子类型模式的方式?
谢谢你,谢谢!
在谷歌中查找和搜索域模型的具体实现。
1条答案
按热度按时间a64a0gku1#
您给予的两个代码示例都是有效的语法--选择哪一个是您的偏好问题。在官方文档中,语法示例与第二个示例更相似:
通过将case对象嵌套在另一个对象中,您可以像
ConfirmAction.NewGame
一样引用它们,如果您在代码库的其他地方使用名称NewGame
,这可能会很方便。final关键字不是必需的,但可能是为了强调扩展case对象没有意义而添加的。有些开发者喜欢将所有的case类标记为final(例如:this和this)--您的示例代码似乎将该逻辑扩展到了case对象。
也就是说,如果
final
关键字被删除,您的代码将正确编译和工作。