Sobes.tech
Junior

O que são modificadores de visibilidade e como usá-los em Kotlin?

sobes.tech IA

Resposta da IA

Os modificadores de visibilidade em Kotlin determinam a acessibilidade das declarações (classes, interfaces, funções, propriedades) para outras partes do programa.

Os principais modificadores de visibilidade:

  • public: Visível em toda parte. É o modificador padrão.
  • internal: Visível apenas dentro de um módulo. Um módulo é considerado um conjunto de ficheiros Kotlin compilados juntos.
  • protected: Visível dentro da classe e das suas subclasses (incluindo membros definidos em classes herdadas). Não visível fora do pacote.
  • private: Visível apenas dentro do ficheiro onde é declarado. Para membros de classe, apenas dentro dessa classe (e do seu objeto companion, classes aninhadas e internas).

Aplicação dos modificadores:

  • A classes, interfaces, objetos e seus construtores.
  • A funções, propriedades e seus getters/setters ao nível superior (fora de classes).
  • A membros de classe (classes aninhadas, internas, funções, propriedades).

Exemplo:

// Ficheiro: example.kt

private const val PRIVATE_CONSTANT = 1 // Visível apenas neste ficheiro

internal fun internalFunction() { // Visível apenas dentro do módulo
    println("Função interna chamada")
}

open class BaseClass {
    protected val protectedProperty = "Protegido" // Visível nesta classe e nas suas subclasses

    fun publicMethod() { // Visível em toda parte (public por padrão)
        println("Método público chamado")
    }

    private fun privateMethod() { // Visível apenas dentro de BaseClass
        println("Método privado chamado")
    }
}

class DerivedClass : BaseClass() {
    fun accessProtected() {
        println("Acedendo à propriedade protegida: $protectedProperty") // Acesso a protected
        // privateMethod() // Erro: private não visível na subclasse
    }
}

fun main() {
    val base = BaseClass()
    base.publicMethod()
    // base.protectedProperty // Erro: protected não visível fora da classe e subclasses

    val derived = DerivedClass()
    derived.accessProtected()

    internalFunction()
    // PRIVATE_CONSTANT // Erro: private a nível superior visível apenas no ficheiro de declaração
}
Modificador Acessibilidade Onde usar
public Em toda parte Por padrão, quando não especificado outro modificador
internal Dentro do módulo Para API dentro de uma biblioteca ou módulo
protected Dentro da classe e suas subclasses (para membros) Para criar hierarquias de classes com herança
private Dentro do ficheiro (nível superior); dentro da classe (para membros) Para ocultar detalhes de implementação dentro do ficheiro ou classe