objetos metodos ejemplos clases scala access-modifiers

metodos - ¿Cuáles son las diferencias entre la clase final y la clase sellada en Scala?



scala ejemplos (2)

Hay dos tipos de modificadores en Scala: final y sealed

Cuáles son las diferencias entre ellos? ¿Cuándo deberías usar uno sobre el otro?


Una clase final no puede ser extendida, punto.

Un rasgo sealed solo puede extenderse en el mismo archivo de origen como está declarado. Esto es útil para crear ADT (tipos de datos algebraicos). Un ADT se define por la suma de sus tipos derivados.

P.ej:

  • Una Option[A] se define por Some[A] + None .
  • Una List[A] se define por :: + Nil .

sealed trait Option[+A] final case class Some[+A] extends Option[A] object None extends Option[Nothing]

Debido a que la Option[A] está sellada, otros desarrolladores no pueden extenderla; al hacerlo, se alteraría su significado .

Some[A] son finales porque no se pueden extender, punto.

Como una ventaja adicional, si un rasgo está sellado, el compilador puede advertirle si su patrón coincide no es lo suficientemente exhaustivo porque sabe que la Option está limitada a Some y None .

opt match { case Some(a) => "hello" }

Advertencia: el partido puede no ser exhaustivo. Fallaría en la siguiente entrada: None


sealed clases sealed (o rasgos) aún se pueden heredar en el mismo archivo fuente (donde las clases final no se pueden heredar en absoluto).

Utilícelo sealed cuando desee restringir el número de subclases de una clase base (consulte "Tipo de datos algebraicos").

Como uno de los beneficios muy prácticos de tal restricción, el compilador ahora puede advertirle acerca de las coincidencias de patrones no exaustivos:

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 } }