密封类的主要原因似乎是,这允许编译器在这些类上进行模式匹配时进行穷举搜索。假设我有用于模式匹配的数据类型。玩具示例:
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
这样,如果我忘记了匹配语句中的一种语句,编译器可以警告我。但是案例类呢?案例类不能相互继承,但特征和普通类可以。那么,密封案例类也是一个好的做法吗?如果我不这样做,会出现什么问题?
您不必密封案例类,但您应该将它们标记为final
因此禁止任何进一步的继承关系。仅当您想要对其子类进行详尽检查时,将它们密封才有用,这不是一个很可能的用例。
将所有类标记为final
默认情况下是一件好事,因为它禁止 API 用户在重写其方法时更改这些类的行为。如果您没有专门设计要子类化的类,则子类化可能会导致应用程序中出现错误,因为子类化的类不再执行其预期的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)