Некоторые библиотеки с открытым исходным кодом похоже, что у твиттеров есть соглашение о маркировке классов case как final
.
Моя команда решает, следует ли принимать это соглашение, но мы еще не понимаем, за что это нужно. В настоящее время единственное возможное преимущество, которое я могу ощутить, - это то, что он предотвращает случайное наследование от case-классов.
Но есть ли другие преимущества? Уменьшает ли это время компиляции или позволяет компилятору добавлять внутренние оптимизации?
Я надеялся, что это поможет в обнаружении недостающих значений в совпадениях с образцом, но, похоже, этого тоже не происходит. В таком простом скрипте компилятор генерирует предупреждение для 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
, поэтому странно, что это не вызывает предупреждения.
final
, говоря, что это более наглядно, это соглашение и открывает возможности для оптимизации компилятора (хотя об этом ничего не известно). - person rmin   schedule 20.04.2016