在scala中将case类标记为final是有什么实际好处的

时间:2016-04-13 01:22:22

标签: scala final sealed

某些开源库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更强烈的限制,所以奇怪的是这不会产生警告。

1 个答案:

答案 0 :(得分:0)

以下是an explanation of some benefits

  

最终案例类不能被任何其他类扩展。这意味着您可以更好地保证代码的行为方式。你知道没有人可以为你的类创建子类,重写一些方法,并使一些事情发生。在调试代码时这很好 - 您不必遍历对象层次结构来找出实际调用的方法。

     

当然,使类最终确实意味着你失去了一种可扩展性。如果您确实发现自己希望允许用户实现功能,则应将该功能包装在特征中并改为使用类型类模式。