Есть два типа модификаторов в Scala: final
и sealed
Каковы различия между окончательным классом и закрытым классом в Scala?
Каковы различия между ними? Когда вы должны использовать один над другим?
Есть два типа модификаторов в Scala: final
и sealed
Каковы различия между окончательным классом и закрытым классом в Scala?
Каковы различия между ними? Когда вы должны использовать один над другим?
A final
класс нельзя продлить, период.
Характеристика A sealed
может быть расширена только в том же исходном файле как указано. Это полезно для создания ADT (алгебраических типов данных). ADT определяется суммой его производных типов.
.: например
Option[A]
определяется Some[A]
+ None
.List[A]
определяется по ::
+ Nil
.sealed trait Option[+A]
final case class Some[+A] extends Option[A]
object None extends Option[Nothing]
Поскольку Option[A]
запечатана, она не может быть расширен другими разработчиками - сделать это изменило бы его смысл.
Some[A]
является окончательным, потому что он не может быть продлен, период.
В качестве дополнительного бонуса, если черта запечатана, компилятор может предупредить вас, если ваш шаблон спички не достаточно исчерпывающими, поскольку он знает что Option
является ограниченной в Some
и None
.
opt match {
case Some(a) => "hello"
}
Предупреждение: матч не может быть исчерпывающим. Он потерпит неудачу на следующем входе:
None
sealed
классов (или черт) по-прежнему могут быть унаследованы в том же исходном файле (где final
классы не могут быть унаследованной вообще).
Используйте, чтобы ограничить количество подклассов базового класса (см.
В качестве одного из самых практических преимуществ такого ограничения компилятор теперь может предупредить вас о не-exaustive шаблоне соответствует:
sealed trait Duo
case class One(i:Int) extends Duo
case class Two(i:Int, j:Int) extends Duo
def test(d:Duo) {
match {
case One(x) => println(x) // warning since you are not matching Two
}
}
Технически «запечатанные» шаблоны могут быть расширены в одном компиляторе * *, а не в том же файле. Тот факт, что компилятор компилятора Scala равен файлу, является детальностью реализации. Могут быть другие компиляторы, которые используют, например, базу данных для хранения исходных артефактов вместо файловой системы. –
Технически говоря 'шаблоны sealed' может быть продлен в том же модуле компиляции * * , а не тот же файл. Тот факт, что компилятор компилятора Scala равен файлу, является детальностью реализации. Могут быть другие компиляторы, которые используют, например, базу данных для хранения исходных артефактов вместо файловой системы. –
@ JörgWMittag Спасибо за добавление, я не знал об этом различии. – dcastro