Sobes.tech
Junior

¿Qué son los modificadores de visibilidad y cómo usarlos en Kotlin?

sobes.tech AI

Respuesta de la IA

Los modificadores de visibilidad en Kotlin determinan la accesibilidad de las declaraciones (clases, interfaces, funciones, propiedades) para otras partes del programa.

Los principales modificadores de visibilidad:

  • public: Visible en todas partes. Es el modificador por defecto.
  • internal: Visible solo dentro de un módulo. Se considera un conjunto de archivos Kotlin compilados juntos.
  • protected: Visible dentro de la clase y sus subclases (incluyendo miembros definidos en clases heredadas). No visible fuera del paquete.
  • private: Visible solo dentro del archivo en el que se declara. Para miembros de clase, solo dentro de esa clase (y su objeto companion, clases anidadas e internas).

Aplicación de modificadores:

  • A clases, interfaces, objetos y sus constructores.
  • A funciones, propiedades y sus getters/setters en el nivel superior (fuera de clases).
  • A miembros de clase (clases anidadas, internas, funciones, propiedades).

Ejemplo:

// Archivo: example.kt

private const val PRIVATE_CONSTANT = 1 // Visible solo en este archivo

internal fun internalFunction() { // Visible solo dentro del módulo
    println("Función interna llamada")
}

open class BaseClass {
    protected val protectedProperty = "Protegido" // Visible en esta clase y sus subclases

    fun publicMethod() { // Visible en todas partes (public por defecto)
        println("Método público llamado")
    }

    private fun privateMethod() { // Visible solo dentro de BaseClass
        println("Método privado llamado")
    }
}

class DerivedClass : BaseClass() {
    fun accessProtected() {
        println("Accediendo a la propiedad protegida: $protectedProperty") // Acceso a protected
        // privateMethod() // Error: private no visible en la subclase
    }
}

fun main() {
    val base = BaseClass()
    base.publicMethod()
    // base.protectedProperty // Error: protected no visible fuera de la clase y subclases

    val derived = DerivedClass()
    derived.accessProtected()

    internalFunction()
    // PRIVATE_CONSTANT // Error: private a nivel superior visible solo en el archivo de declaración
}
Modificador Accesibilidad Dónde usar
public En todas partes Por defecto, cuando no se especifica otro modificador
internal Dentro del módulo Para API dentro de una biblioteca o módulo
protected Dentro de la clase y sus subclases (para miembros) Para crear jerarquías de clases con herencia
private Dentro del archivo (nivel superior); dentro de la clase (miembros) Para ocultar detalles de implementación dentro del archivo o clase