Modelar un correo electrónico, un contacto o una bandeja de mensajes en código requiere agrupar atributos y funcionalidades en una sola estructura. Las clases en Kotlin son ese molde que define propiedades y comportamientos para crear objetos reutilizables, ideales para quienes aprenden programación orientada a objetos.
¿Qué es una clase en Kotlin y para qué sirve?
Una clase funciona como un plano: describe qué datos tendrá un objeto y qué acciones podrá ejecutar. Los datos se guardan en variables (atributos) y las acciones se definen con funciones (métodos).
Piensa en un email: tiene asunto, remitente, mensaje y la posibilidad de marcarse como leído o no leído. Todo eso vive ordenado dentro de una sola clase.
¿Qué diferencia hay entre clase y objeto? La clase es la plantilla, el objeto es la instancia que vive en memoria. Una clase puede generar muchos objetos distintos, cada uno con sus propios valores.
¿Cómo declaro una clase con la palabra clave class?
En Kotlin usas la palabra reservada class seguida del nombre y, si lo necesitas, un constructor entre paréntesis [01:05]. Dentro de las llaves agregas variables internas y funciones que modelan el comportamiento.
kotlin
class Email(
val asunto: String,
val remitente: String,
val mensaje: String
) {
var leido: Boolean = false
fun marcarComoLeido(){ leido =true}fun marcarComoNoLeido(){ leido =false}fun mostrarInfo(){println("$remitente - $asunto - Leído: $leido")}
}
Los parámetros del constructor (val asunto, val remitente, val mensaje) se declaran con tipo, a diferencia de las funciones donde solo indicas el tipo. La variable leido arranca en false y cambia con los métodos marcarComoLeido() y marcarComoNoLeido() [02:30].
¿Cómo se crea una instancia de una clase en Kotlin?
Para dar vida a un objeto necesitas invocar el constructor pasando los valores que la clase exige. Aquí entran los parámetros nombrados, igual que en las funciones.
kotlin
val email1 = Email(
asunto = "Reunión viernes",
remitente = "carlos@email.com",
mensaje = "No se te olvide nuestra reunión para el viernes"
)
email1.mostrarInfo()
Si imprimes directamente el objeto con println(email1) verás algo como Email@277116f14, que es la dirección en memoria donde vive el objeto [04:50]. Para mostrar su contenido real, llama al método mostrarInfo().
¿Por qué Kotlin imprime una dirección rara al hacer println de un objeto? Porque por defecto muestra la referencia en memoria, no los atributos. Necesitas un método que formatee e imprima los datos, como mostrarInfo().
¿Puedo crear una clase sin constructor con parámetros?
Sí. Cuando una clase no necesita recibir datos al instanciarse, puedes omitir los paréntesis o dejarlos vacíos. Esto es útil para clases contenedoras, como una bandeja de correos.
kotlin
class BandejaEmails {
val emails = mutableListOf<Email>()
fun agregarEmail(email:Email){ emails.add(email)}fun contarNoLeidos():Int{var contador =0for(email in emails){if(!email.leido) contador++}return contador
}
}
Fíjate en algo importante: el mutableListOf<Email>() demuestra que las colecciones aceptan tus propias clases como tipo, no solo Int o String [06:40]. Y los métodos pueden recibir objetos de otras clases como parámetros, conectando piezas entre sí.
¿Cómo se relacionan varias clases entre sí?
Una clase puede contener listas de objetos de otra clase y exponer funciones para manipularlas. Así modelas relaciones reales: una bandeja tiene muchos correos, un usuario tiene muchos contactos.
kotlin
val email1 = Email("Hola", "ana@mail.com", "Mensaje 1")
val email2 = Email("Tarea", "luis@mail.com", "Mensaje 2")
val email3 = Email("Pago", "pago@mail.com", "Mensaje 3")
email1.marcarComoLeido()
val bandeja = BandejaEmails()
bandeja.agregarEmail(email1)
bandeja.agregarEmail(email2)
bandeja.agregarEmail(email3)
println("Faltan por leer: ${bandeja.contarNoLeidos()}")
Como email1 ya quedó marcado como leído, el resultado será 2 correos pendientes. Si quitas esa línea, quedarán 3. Esta lógica es la misma que ya usabas con listas: las listas también son objetos con métodos, solo que no lo habías interiorizado [09:15].
¿Cómo practico creando una clase Contacto?
Un buen ejercicio para fijar el concepto es modelar un contacto con nombre, email y un método que lo muestre en pantalla.
kotlin
class Contacto(val nombre: String, val email: String) {
fun mostrarContacto() {
println("$nombre - $email")
}
}
val contacto1 = Contacto("María", "maria@mail.com")
contacto1.mostrarContacto()
Al ejecutar, verás impreso el nombre y el email del contacto recién creado. Con esto ya dominas la base: declarar una clase, definir su constructor, agregar métodos y crear instancias.
¿Qué clases del mundo real te gustaría modelar primero? Cuéntame en los comentarios qué objeto vas a convertir en código.