Modificadores de visibilidad y encapsulamiento en Kotlin
Resumen
El encapsulamiento es un concepto clave en la programación orientada a objetos que permite proteger la información interna de una clase mediante el uso de modificadores de visibilidad. Al restringir el acceso directo desde fuentes externas, puedes evitar manipulaciones indeseadas y mantener la integridad de tus datos y operaciones.
¿Qué son los modificadores de visibilidad?
Los modificadores de visibilidad definen el nivel de acceso que tendrán variables y métodos en las clases:
Public: todos los elementos son accesibles desde fuera por defecto si no se especifica lo contrario.
Private: restringe el acceso para que solo sea visible internamente en la clase.
Por ejemplo, al crear una clase Email, podrías tener ciertas variables públicas que se pueden acceder fácilmente y algunas privadas que necesiten protección por razones de seguridad.
¿Cómo usar modificadores de visibilidad en variables y métodos?
Cuando crees un objeto como un Email con un asunto y una contraseña, normalmente no querrías exponer la contraseña directamente fuera del objeto. Para ello, Kotlin permite declarar variables como private, protegiéndolas de accesos externos:
Un método para enviar correos debe estar expuesto al exterior, pero una función para cifrarlos suele ser un detalle interno. De esa forma, también declaras métodos privados:
privatefunencrypt(){// lógica de cifrado}
Así, controlas las operaciones permitidas desde otros lugares.
¿Qué es la herencia en Kotlin y cómo influye en la visibilidad?
La herencia permite crear clases nuevas basadas en clases existentes, reutilizando sus métodos y atributos.
Para poder extender una clase, necesitas usar el modificador open en tu clase base, ya que por defecto Kotlin restringe esta capacidad:
classBankAccount(privatevar balance:Double){private fun validateAmount(amount:Double):Boolean{return amount >0} fun deposit(amount:Double):String{returnif(validateAmount(amount)){ balance += amount
return"Deposit successful. Balance = $balance"}else{return"Invalid amount"}} fun getBalance():Double= balance
}fun main(){ val bankAccount =BankAccount(100.0)println(bankAccount.deposit(150.0))}
fun main(){println("\n=== EJERCICIO ===")println("Crea clase 'BankAccount' con:")println("1. balance (private)")println("2. deposit() (public)")println("3. validateAmount() (private)") val account =BankAccount(500.0)println("En el momento tienes: ${account.currentBalance}") account.deposit(10.0)println("En el momento tienes: ${account.currentBalance}")}classBankAccount(privatevarbalance:Double){ val currentBalance:Doubleget()= balance
fun deposit(monto:Double){if(validateAmount(monto)){println("Depósito exitoso de: $monto") balance+=monto
}else{println("Error: El monto $monto no es válido para depositar.")}}private fun validateAmount(monto:Double):Boolean{returnif(monto >0)trueelsefalse}}