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