某些开源库like twitters似乎有一个将案例类标记为final
的约定。
我的团队正在决定是否采用这个惯例,但我们还不了解这样做的专业人士。目前,我能感知的唯一可能的优势是它可以阻止案例类的意外继承。
但还有其他优势吗?它是否会改善编译时间或允许编译器添加内部优化?
我希望它能帮助检测模式匹配中的缺失值,但它似乎也没有这样做。在这样的简单脚本中,编译器会为matchSealed
生成警告,但不会为matchFinal
生成警告:
sealed case class Sealed(one: Option[Int], two: Option[Int])
def matchSealed(s: Sealed): Unit = s match {
case Sealed(Some(i), None) => println(i)
}
final case class Final(one: Option[Int], two: Option[Int])
def matchFinal(f: Final): Unit = f match {
case Final(Some(i), None) => println(i)
}
我对final
的印象是它比sealed
更强烈的限制,所以奇怪的是这不会产生警告。
答案 0 :(得分:0)
以下是an explanation of some benefits:
最终案例类不能被任何其他类扩展。这意味着您可以更好地保证代码的行为方式。你知道没有人可以为你的类创建子类,重写一些方法,并使一些事情发生。在调试代码时这很好 - 您不必遍历对象层次结构来找出实际调用的方法。
当然,使类最终确实意味着你失去了一种可扩展性。如果您确实发现自己希望允许用户实现功能,则应将该功能包装在特征中并改为使用类型类模式。