scala 将密封的Trait子类型声明为伴随对象中的最终情况对象

pgky5nke  于 2023-10-18  发布在  Scala
关注(0)|答案(1)|浏览(123)

我最近在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

此外,我想更多地了解这种方法及其好处。您能解释一下这些选择背后的基本原理吗?并向我指出一些资源,在那里我可以了解更多关于这种声明子类型模式的方式?
谢谢你,谢谢!
在谷歌中查找和搜索域模型的具体实现。

a64a0gku

a64a0gku1#

您给予的两个代码示例都是有效的语法--选择哪一个是您的偏好问题。在官方文档中,语法示例与第二个示例更相似:

sealed trait Message
case class PlaySong(name: String) extends Message
case class IncreaseVolume(amount: Int) extends Message
case class DecreaseVolume(amount: Int) extends Message
case object StopPlaying extends Message

通过将case对象嵌套在另一个对象中,您可以像ConfirmAction.NewGame一样引用它们,如果您在代码库的其他地方使用名称NewGame,这可能会很方便。
final关键字不是必需的,但可能是为了强调扩展case对象没有意义而添加的。有些开发者喜欢将所有的case类标记为final(例如:thisthis)--您的示例代码似乎将该逻辑扩展到了case对象。
也就是说,如果final关键字被删除,您的代码将正确编译和工作。

相关问题