Clases selladas de Kotlin

Tabla de contenido

En este artículo, aprenderá sobre la clase sellada, cómo se crean y cuándo usarlas con la ayuda de ejemplos.

Las clases selladas se utilizan cuando un valor puede tener solo uno de los tipos de un conjunto limitado (jerarquías restringidas).

Antes de entrar en detalles sobre las clases selladas, exploremos qué problema resuelven. Tomemos un ejemplo (tomado del sitio web oficial de Kotlin - artículo de clases selladas):

 class Expr class Const(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) else -> throw IllegalArgumentException("Unknown expression") )

En el programa anterior, la clase base Expr tiene dos clases derivadas Const (representa un número) y Sum (representa la suma de dos expresiones). Aquí, es obligatorio usar la elserama para la condición predeterminada en la expresión when.

Ahora, si deriva una nueva subclase de la Exprclase, el compilador no detectará nada, ya que la elserama lo maneja, lo que puede provocar errores. Hubiera sido mejor si el compilador emitiera un error cuando agregamos una nueva subclase.

Para resolver este problema, puede utilizar la clase sellada. Como se mencionó, la clase sellada restringe la posibilidad de crear subclases. Y, cuando maneja todas las subclases de una clase sellada en una whenexpresión, no es necesario usar elsebranch.

Para crear una clase sellada, se usa un modificador sellado. Por ejemplo,

 clase sellada Expr

Ejemplo: clase sellada

Así es como puede resolver el problema anterior utilizando una clase sellada:

 sealed class Expr class Const(val value: Int) : Expr() class Sum(val left: Expr, val right: Expr) : Expr() object NotANumber : Expr() fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) NotANumber -> java.lang.Double.NaN ) 

Como puede ver, no hay elserama. Si deriva una nueva subclase de Exprclass, el compilador se quejará a menos que la subclase se maneje en la whenexpresión.

Algunas notas importantes

  • Todas las subclases de una clase sellada deben declararse en el mismo archivo donde se declara la clase sellada.
  • Una clase sellada es abstracta por sí misma y no puede instanciar objetos a partir de ella.
  • No puede crear constructores no privados de una clase sellada; sus constructores son privatepor defecto.

Diferencia entre Enum y Sealed Class

La clase Enum y la clase sellada son bastante similares. El conjunto de valores para un tipo de enumeración también está restringido como una clase sellada.

La única diferencia es que, enum puede tener una sola instancia, mientras que una subclase de una clase sellada puede tener varias instancias.

Articulos interesantes...