Control de herencia con sealed classes en Kotlin
Clase 28 de 35 • Curso de Kotlin
Resumen
¿Qué son las sealed classes en Kotlin y para qué sirven?
Las sealed classes en Kotlin constituyen una poderosa herramienta que permite controlar la herencia de forma precisa y organizada desde una clase base específica. Esto significa que, cuando se desea limitar la cantidad o el tipo de subclases que derivan de una clase base, esta es la estructura adecuada para utilizar.
¿Cómo modelar estados específicos de un correo electrónico usando sealed classes?
Supongamos un caso práctico: estamos enviando un correo electrónico que puede encontrarse en diversos estados:
- Enviado correctamente.
- Falló al intentar enviarse.
- Guardado como borrador.
- Programado para enviarse más tarde.
Cada uno de estos casos puede modelarse como un estado particular, herederos de una clase base denominada EmailStatus.
Ejemplos prácticos de estados con sealed classes
- Estado Enviado (Send): Puede incluir un parámetro indicando a quién se envió.
- Estado Fallido (Failed): Contiene un mensaje de error.
- Estado Borrador (Draft): No necesita parámetros, por lo que puede modelarse como un data object.
- Estado Programado (Scheduled): Contiene información referente al momento en que está programado para enviarse.
Cuando deseamos compartir parámetros entre estados, estos pueden definirse directamente en la clase base. Por ejemplo, un identificador común (statusID) puede definir el tipo de estado usando un número.
¿Cómo implementar una sealed class?
Tomando el ejemplo del estado del correo electrónico, la implementación básica en Kotlin podría verse similar a esto:
sealed class EmailStatus(val statusID: Int) {
data class Send(val enviadoA: String): EmailStatus(0)
data class Failed(val error: String): EmailStatus(1)
data object Draft: EmailStatus(2)
data class Scheduled(val time: String): EmailStatus(3)
}
¿Cómo integrar expresiones when con sealed classes?
Una poderosa característica de las sealed classes es cómo interactúan con la expresión condicional when, permitiendo manejar cada estado explícitamente y obtener una estructura clara y fácil de mantener.
Por ejemplo:
when(emailStatus) {
is EmailStatus.Send -> println("Correo enviado a ${emailStatus.enviadoA}")
is EmailStatus.Failed -> println("Error: ${emailStatus.error}")
EmailStatus.Draft -> println("Correo guardado como borrador")
is EmailStatus.Scheduled -> println("Correo programado para: ${emailStatus.time}")
}
Esta estructura ofrece claridad y facilidad para mantener el código que maneja temas específicos relacionados con interacciones y estados de la interfaz de usuario.
¿Cómo practicar el uso de sealed classes creando carpetas de correo electrónico?
Para solidificar aún más el aprendizaje, puedes practicar creando una sealed class llamada EmailFolder, donde definas diferentes carpetas como Inbox, Spam y Send. Asigna un contador compartido, y para algunos estados, añade parámetros específicos que definan su comportamiento particular.
Te invitamos a implementar en tus proyectos estas estructuras, logrando un manejo eficiente y claro de diferentes estados y comportamientos en aplicaciones Kotlin. No dudes en compartir tu experiencia o preguntas en los comentarios.