Sobes.tech
Junior

Co jsou modifikátory viditelnosti a jak je používat v Kotlinu?

sobes.tech AI

Odpověď od AI

Modifikátory viditelnosti v Kotlinu určují dostupnost deklarací (tříd, rozhraní, funkcí, vlastností) pro ostatní části programu.

Hlavní modifikátory viditelnosti:

  • public: Viditelný všude. Výchozí modifikátor.
  • internal: Viditelný pouze uvnitř jednoho modulu. Modul je soubor Kotlinových souborů kompilovaných dohromad.
  • protected: Viditelný uvnitř třídy a jejích podtříd (včetně členů definovaných v dědičných třídách). Není viditelný mimo balíček.
  • private: Viditelný pouze uvnitř souboru, ve kterém je deklarován. U členů třídy je viditelný pouze uvnitř této třídy (včetně jejího companion object, vnořených a vnitřních tříd).

Použití modifikátorů:

  • U tříd, rozhraní, objektů a jejich konstruktorů.
  • U funkcí, vlastností a jejich getterů/setterů na nejvyšší úrovni (mimo třídy).
  • U členů třídy (vnořené třídy, vnitřní třídy, funkce, vlastnosti).

Příklad:

// Soubor: example.kt

private const val PRIVATE_CONSTANT = 1 // Viditelný pouze v tomto souboru

internal fun internalFunction() { // Viditelný pouze uvnitř modulu
    println("Interní funkce volána")
}

open class BaseClass {
    protected val protectedProperty = "Vědomé" // Viditelné v této třídě a jejích podtřídách

    fun publicMethod() { // Viditelné všude (výchozí public)
        println("Veřejná metoda volána")
    }

    private fun privateMethod() { // Viditelné pouze uvnitř BaseClass
        println("Privátní metoda volána")
    }
}

class DerivedClass : BaseClass() {
    fun accessProtected() {
        println("Přístup k chráněné vlastnosti: $protectedProperty") // Přístup k protected
        // privateMethod() // Chyba: private není viditelné v podtřídě
    }
}

fun main() {
    val base = BaseClass()
    base.publicMethod()
    // base.protectedProperty // Chyba: protected není viditelné mimo třídu a její podtřídy

    val derived = DerivedClass()
    derived.accessProtected()

    internalFunction()
    // PRIVATE_CONSTANT // Chyba: private na nejvyšší úrovni je viditelná pouze v deklarovaném souboru
}
Modifikátor Přístupnost Kde použít
public Všude Výchozí, když není uveden jiný modifikátor
internal Uvnitř modulu Pro API uvnitř knihovny nebo modulu
protected Uvnitř třídy a jejích podtříd (pro členy třídy) Pro vytváření hierarchií tříd s dědičností
private Uvnitř souboru (pro nejvyšší úroveň); uvnitř třídy (pro členy) Pro skrytí implementačních detailů uvnitř souboru nebo třídy