gpt4 book ai didi

scala - 密封案例类是一种好习惯吗?

转载 作者:行者123 更新时间:2023-12-04 10:49:35 25 4
gpt4 key购买 nike

密封类的主要原因似乎是因为这允许编译器在对这些类进行模式匹配时进行彻底的搜索。说我有用于模式匹配的数据类型。玩具示例:

sealed trait Statement
case class Assign(name: String, value: Int) extends Statement
case class Print(name: String) extends Statement
case class IfZero(name: String, thenn: Statement, els: Option[Statement]) extends Statement
case class Block(statements: List[Statement]) extends Statement

这些类的用例是通过模式匹配来使用它们:
def execute(statement: Statement): Unit = statement match {
case Assign(name, value) => ???
case Print(name) => ???
case IfZero(name, thenn, els) => ???
case Block(statements) => statements foreach { execute(_) }
}

为此, Statement特性是 sealed,这样,如果我忘记了match语句中的一种语句,编译器就可以警告我。但是案例类呢?案例类不能彼此继承,但是特征类和普通类可以继承。那么,密封案例类也是一种好习惯吗?如果我不这样做怎么办?

最佳答案

您不必密封案例类,但应将它们标记为final,因此禁止任何进一步的继承关系。仅当您要对其子类进行详尽检查时,使它们密封才有用,而这不是很可能的用例。

默认情况下,将所有类标记为final是一件好事,因为它禁止您的API的用户在覆盖这些类的方法时更改这些类的行为。如果您没有专门设计要子类化的类,则子类化可能会导致应用程序中的错误,因为子类化的类不再执行预期的工作。

关于scala - 密封案例类是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31128383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com