En Kotlin, los modificadores de visibilidad determinan desde dónde se puede acceder a las clases, objetos, interfaces, constructores, funciones y propiedades. Comprender estos modificadores es crucial para diseñar aplicaciones seguras y bien estructuradas.
Tipos de Modificadores de Visibilidad
Kotlin proporciona cuatro modificadores de visibilidad:
- public: El miembro es accesible desde cualquier lugar.
- private: El miembro es accesible solo dentro del archivo o clase donde se declara.
- protected: El miembro es accesible dentro de la clase y sus subclases.
- internal: El miembro es accesible dentro del mismo módulo.
- public
El modificador public
es el predeterminado. Si no se especifica ningún modificador de visibilidad, el miembro es public
.
class PublicClass { public var publicProperty: String = "I am public" public fun publicFunction() { println("This is a public function") } }
- private
El modificador private
restringe el acceso al miembro solo dentro del archivo o clase donde se declara.
class PrivateClass { private var privateProperty: String = "I am private" private fun privateFunction() { println("This is a private function") } fun accessPrivateMembers() { println(privateProperty) privateFunction() } }
- protected
El modificador protected
permite el acceso dentro de la clase y sus subclases. No es aplicable a los miembros de nivel superior (top-level).
open class ProtectedClass { protected var protectedProperty: String = "I am protected" protected fun protectedFunction() { println("This is a protected function") } } class SubClass : ProtectedClass() { fun accessProtectedMembers() { println(protectedProperty) protectedFunction() } }
- internal
El modificador internal
hace que el miembro sea accesible solo dentro del mismo módulo. Un módulo es un conjunto de archivos Kotlin compilados juntos.
internal class InternalClass { internal var internalProperty: String = "I am internal" internal fun internalFunction() { println("This is an internal function") } }
Comparación de Modificadores de Visibilidad
Modificador | Accesibilidad |
---|---|
public | En cualquier lugar |
private | Dentro del archivo o clase |
protected | Dentro de la clase y subclases |
internal | Dentro del mismo módulo |
Ejemplos Prácticos
Ejemplo 1: Uso de private
en una Clase
class ExamplePrivate { private var secret: String = "This is a secret" fun revealSecret() { println(secret) } } fun main() { val example = ExamplePrivate() // example.secret // Error: Cannot access 'secret': it is private in 'ExamplePrivate' example.revealSecret() // Output: This is a secret }
Ejemplo 2: Uso de protected
en Herencia
open class Parent { protected var familySecret: String = "Family secret" } class Child : Parent() { fun showFamilySecret() { println(familySecret) } } fun main() { val child = Child() child.showFamilySecret() // Output: Family secret }
Ejemplo 3: Uso de internal
en un Módulo
internal class InternalExample { internal var internalData: String = "Internal data" } fun main() { val example = InternalExample() println(example.internalData) // Output: Internal data }
Ejercicio Práctico
Ejercicio 1: Modificadores de Visibilidad
-
Crea una clase
BankAccount
con las siguientes propiedades y métodos:accountNumber
(public)balance
(private)deposit(amount: Double)
(public)withdraw(amount: Double)
(public)printBalance()
(public)
-
Implementa la clase de manera que solo se pueda acceder al balance a través de los métodos
deposit
ywithdraw
.
Solución
class BankAccount(val accountNumber: String) { private var balance: Double = 0.0 fun deposit(amount: Double) { if (amount > 0) { balance += amount println("Deposited: $$amount") } } fun withdraw(amount: Double) { if (amount > 0 && amount <= balance) { balance -= amount println("Withdrew: $$amount") } else { println("Insufficient funds") } } fun printBalance() { println("Balance: $$balance") } } fun main() { val account = BankAccount("123456") account.deposit(100.0) account.withdraw(50.0) account.printBalance() // Output: Balance: $50.0 }
Conclusión
Los modificadores de visibilidad en Kotlin son esenciales para controlar el acceso a los miembros de una clase y garantizar la encapsulación adecuada. Al comprender y utilizar estos modificadores correctamente, puedes diseñar aplicaciones más seguras y mantenibles. En el siguiente tema, exploraremos las clases de datos y las clases selladas, que son características avanzadas de Kotlin para modelar datos de manera más efectiva.
Curso de Programación en Kotlin
Módulo 1: Introducción a Kotlin
- Introducción a Kotlin
- Configuración del Entorno de Desarrollo
- Conceptos Básicos de Kotlin: Variables y Tipos de Datos
- Flujo de Control: Condicionales y Bucles
- Funciones y Lambdas
Módulo 2: Programación Orientada a Objetos en Kotlin
- Clases y Objetos
- Herencia e Interfaces
- Modificadores de Visibilidad
- Clases de Datos y Clases Selladas
- Declaraciones de Objetos y Objetos Compañeros
Módulo 3: Características Avanzadas de Kotlin
- Colecciones y Genéricos
- Funciones de Extensión
- Funciones de Orden Superior y Programación Funcional
- Corrutinas y Programación Asíncrona
- DSL (Lenguaje Específico de Dominio) en Kotlin
Módulo 4: Kotlin para Desarrollo Android
- Introducción al Desarrollo Android con Kotlin
- Construcción de Interfaces de Usuario
- Manejo de Entrada del Usuario
- Redes y Almacenamiento de Datos
- Pruebas y Depuración