Cuando necesitamos representar elementos del mundo real en programación, las clases y los objetos son la opción ideal. A través de Kotlin, podremos entender mejor estos conceptos creando ejemplos claros como el de un email con distintas propiedades y acciones posibles, tales como marcarlo como leído o no leído. Este proceso nos ayudará a entender cómo estructurar datos y funcionalidades fácilmente.
¿Qué es una clase y para qué sirve en Kotlin?
Una clase es como un molde o plano que te permite definir propiedades (atributos) y funcionalidades (métodos). Al igual que en el ejemplo del correo electrónico, puedes crear una clase Email con atributos como asunto, remitente, mensaje y una propiedad para indicar si ha sido leído o no. Las funcionalidades están representadas por métodos como marcar como leído o no leído, o mostrar información.
Por ejemplo, puedes definir una clase así:
classEmail(val asunto: String,val remitente: String,val mensaje: String){var leido: Boolean =falsefunmarcarComoLeido(){ leido =true}funmarcarComoNoLeido(){ leido =false}funmostrarInfo(){println("Remitente: $remitente, Asunto: $asunto, Leído: $leido")}}
Luego, puedes crear objetos (instancias) que vivirán realmente en memoria basados en ese molde inicial. Un ejemplo es:
val emailUno =Email( asunto ="Reunión viernes", remitente ="carlos@email.com", mensaje ="No olvides la reunión del viernes.")emailUno.mostrarInfo()
¿Cómo relacionar una clase con otra y crear colecciones de objetos?
A veces, una clase podrá contener o depender de otras clases. Un ejemplo claro es una bandeja de correos (BandejaEmails) que contenga una lista mutable de objetos tipo Email. Para manejar esta relación, se utilizan estructuras como listas mutables.
Aquí tienes un ejemplo práctico:
class BandejaEmails {val emails = mutableListOf<Email>()funagregarEmail(email: Email){ emails.add(email)}funcontarNoLeidos(): Int {var contador =0for(email in emails){if(!email.leido){ contador++}}return contador
}}
Luego instancias objetos de correos electrónicos y los agregas a tu bandeja:
val emailUno =Email("Reunión viernes","carlos@email.com","No olvides la reunión del viernes.")val emailDos =Email("Saludos","ana@email.com","Un saludo cordial.")val emailTres =Email("Factura","tienda@email.com","Adjunto la factura.")emailUno.marcarComoLeido()val bandejaEmails =BandejaEmails()bandejaEmails.agregarEmail(emailUno)bandejaEmails.agregarEmail(emailDos)bandejaEmails.agregarEmail(emailTres)println("Faltan por leer: ${bandejaEmails.contarNoLeidos()}")// Resultado debería ser 2
¿Cómo puedes practicar creando una clase con propiedades simples?
Para poner en práctica lo aprendido, puedes crear por tu cuenta una clase sencilla llamada Contacto:
Esta clase debe tener dos propiedades: nombre y email.
También debe incluir una función que imprima los datos del contacto.
Este enfoque práctico te permitirá interiorizar rápidamente cómo funcionan las clases, objetos y métodos, fortaleciendo tu manejo del lenguaje Kotlin. ¿Te animas a practicar creando nuevas clases ahora mismo?
La razón por la que se prefiere val sobre var para estos parámetros/propiedades es para fomentar la inmutabilidad.
val crea propiedades de solo lectura (read-only): Si un parámetro de constructor se declara con val, la propiedad correspondiente solo tendrá un getter generado automáticamente. No podrás reasignarle un nuevo valor desde fuera o dentro de la clase después de la inicialización.
var crea propiedades mutables (read-write): Si un parámetro de constructor se declara con var, la propiedad correspondiente tendrá tanto un getter como un setter (a menos que se especifique lo contrario), permitiendo que su valor sea modificado después de la creación del objeto.
Se considera una buena práctica diseñar tus clases con propiedades val por defecto y solo usar var cuando la mutabilidad es explícitamente necesaria para el propósito de la clase.
aunque var ofrece la flexibilidad de la mutabilidad, esta flexibilidad viene con un costo significativo en complejidad, seguridad y riesgo de concurrencia. Al preferir val, Kotlin y la comunidad de desarrollo fomentan activamente la inmutabilidad, una restricción que, irónicamente, libera al programador de la preocupación por los efectos secundarios y simplifica la creación de sistemas de software más estables y mantenibles.
Este es mi aporte:
classContacto( val nombre:String, val email:String){ fun mostrarContacto(){println("El contacto se llama $nombre y tiene correo $email")}}val contacto1 =Contacto("Juan","juan@gmail.com") contacto1.mostrarContacto()
Ejercicio resuelto.
Lo hice como me parecio que debia quedar.
Ejercicio Resuelto (La verdad estaba sencillo, creo que lo que hizo el profesor tenía un poco más de lógica), está súper genial la verdad el tema de POO, no dejen de seguir estudiando...