5.2.-Visibilidad en miembros
5.2. Visibilidad en miembros de clases¶
En Kotlin, al igual que en una base de superhéroes, no todo el mundo puede entrar en todas las áreas. Hay diferentes niveles de acceso dependiendo de quién seas y qué permisos tengas. Los modificadores de visibilidad de Kotlin controlan exactamente esto: quién puede acceder a tus clases, interfaces, funciones y propiedades. Vamos a ver los diferentes niveles de acceso disponibles:
1. Visibilidad¶
Los modificadores de visibilidad se utilizan para determinar qué otros elementos del código tienen acceso al elemento que se está consultando/modificando. Se aplican a algunos elementos diferentes en el código, en varios niveles de alcance. La forma en que se aplican estas reglas puede variar ligeramente entre estos diferentes usos, lo que puede resultar confuso al principio.
Las clases, objetos, interfaces, constructores, funciones/métodos, propiedades/atributos y sus 'setters' pueden tener modificadores de visibilidad. (Los 'setters' tendrán una visibilidad igual o más restrictiva que la propiedad).
1.1. Public¶
Este es el valor predeterminado, y se puede acceder a cualquier clase, función/método, propiedad/atributo, interfaz u objeto que tenga este modificador desde cualquier lugar.
1.2. Private¶
Se puede acceder a una función/método, interfaz o clase de nivel superior que se declara como privada SOLO desde dentro del mismo archivo.
Cualquier función/método o propiedad/atributo que se declare privada dentro de una clase, objeto o interfaz solo puede ser visible para otros miembros de esa misma clase, objeto o interfaz.
Un constructor privado debe usar la palabra clave 'constructor'. Si un constructor es marcado como privado no se puede instanciar un objeto con ese constructor, tendrá que usarse desde dentro de la misma clase. Su uso más común es para crear objetos singleton, desde un companion object un método llama al constructor, creando una instancia de la clase y se guarda en una propiedad del companion object, y se crea otro método de clase para acceder a esa propiedad.
class Car private constructor(val name: String, val plateNo: String) {
companion object {
private val car = Car("BMW", "1234")
fun getInstance() = car
}
}
// Obtengo el objeto coche.
fun main(){
var car = Car.getInstance()
}
1.3. Protected¶
Solo se puede aplicar a propiedades/atributos o funciones/métodos dentro de una clase, objeto o interfaz, no se puede aplicar a funciones, clases o interfaces de nivel superior. Las propiedades o funciones con este modificador solo son accesibles dentro de la clase que lo define y cualquier subclase.
1.4. Internal¶
En un proyecto que tiene un módulo (módulo Gradle o Maven), una clase, objeto, interfaz o función especificada con este modificador dentro de ese módulo solo es accesible desde ese módulo.
Actividad 1: Jugando con Modificadores de Visibilidad¶
Pregunta: ¿Cómo afectan los modificadores de visibilidad al acceso de una propiedad dentro de una clase y desde fuera de ella en Kotlin?
Supongamos que tienes una clase Libro que tiene una propiedad titulo y un método mostrarTitulo(). Queremos entender cómo los diferentes modificadores de visibilidad (private, protected, internal, public) afectan la capacidad de acceder a titulo desde dentro de la clase, desde una subclase, y desde fuera de cualquier clase.
Código:
open class Libro {
var titulo: String = "El secreto de Kotlin"
fun mostrarTitulo():String {
return titulo.uppercase()
}
}
class Novela : Libro() {
fun revelarTitulo():String {
titulo.uppercase()
}
}
fun main() {
val miLibro = Libro()
println(miLibro.mostrarTitulo()) // Intenta acceder a titulo desde aquí
println(miLibro.titulo) // Intenta acceder a titulo desde aquí
val miNovela = Novela()
println(miNovela.revelarTitulo()) // Intenta acceder a titulo desde aquí
println(miNovela.titulo) // Intenta acceder a titulo desde aquí
}
Respuesta: Para entender el impacto de los modificadores de visibilidad, vamos a modificar el modificador de visibilidad de la propiedad titulo en la clase Libro y observar los resultados:
public(Por defecto): La propiedadtituloes accesible desde cualquier parte del código. En este caso, tantomostrarTitulo()dentro deLibrocomorevelarTitulo()dentro deNovelapueden acceder atitulo, así como el acceso directo atitulodesdemain.private: La propiedadtitulosolo es accesible dentro de la claseLibro. NiNovelani el métodomainpueden acceder atitulodirectamente. Tendrías que usarmostrarTitulo()para ver el título.protected: Similar aprivate, pero permite el acceso desde subclases. En este caso,revelarTitulo()enNovelapuede acceder atitulo, peromainno puede.internal: La propiedadtituloes accesible desde cualquier archivo dentro del mismo módulo. SiLibro,Novela, ymainestán en el mismo módulo, todos pueden acceder atitulo. Este acceso es restringido fuera del módulo.
Para modificar el código y probar cada uno de estos escenarios, simplemente cambia el modificador de titulo en Libro a private, protected, o internal y observa los errores de compilación que surgen al intentar acceder a titulo desde diferentes partes del código.
2. Resumen¶
Aquí te dejo una forma divertida de recordarlo:
- Public: Como un parque público; abierto a todos.
- Private: Como tu diario personal; solo para tus ojos.
- Protected: Como la cocina en una fiesta; solo para el equipo y familiares cercanos.
- Internal: Como un club local; solo para los miembros de la comunidad.
¡Ahora ya tienes el poder de controlar quién puede acceder a las partes de tu código, como un verdadero maestro de la base secreta de superhéroes de Kotlin!