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 propiedadtitulo
es accesible desde cualquier parte del código. En este caso, tantomostrarTitulo()
dentro deLibro
comorevelarTitulo()
dentro deNovela
pueden acceder atitulo
, así como el acceso directo atitulo
desdemain
.private
: La propiedadtitulo
solo es accesible dentro de la claseLibro
. NiNovela
ni el métodomain
pueden acceder atitulo
directamente. Tendrías que usarmostrarTitulo()
para ver el título.protected
: Similar aprivate
, pero permite el acceso desde subclases. En este caso,revelarTitulo()
enNovela
puede acceder atitulo
, peromain
no puede.internal
: La propiedadtitulo
es accesible desde cualquier archivo dentro del mismo módulo. SiLibro
,Novela
, ymain
está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!