Sobes.tech
Junior

Czym są modyfikatory widoczności i jak ich używać w Kotlin?

sobes.tech AI

Odpowiedź od AI

Modyfikatory widoczności w Kotlinie określają dostępność deklaracji (klas, interfejsów, funkcji, właściwości) dla innych części programu.

Główne modyfikatory widoczności:

  • public: Widoczne wszędzie. Jest domyślnym modyfikatorem.
  • internal: Widoczne tylko w obrębie modułu. Moduł to zbiór plików Kotlin kompilowanych razem.
  • protected: Widoczne w obrębie klasy i jej podklas (w tym członków zdefiniowanych w klasach dziedziczących). Nie widoczne poza pakietem.
  • private: Widoczne tylko w pliku, w którym jest zadeklarowane. Dla członków klasy, tylko w tej klasie (oraz jej obiekcie companion, klasach zagnieżdżonych i wewnętrznych).

Zastosowanie modyfikatorów:

  • Do klas, interfejsów, obiektów i ich konstruktorów.
  • Do funkcji, właściwości i ich getterów/setterów na poziomie górnym (poza klasami).
  • Do członków klasy (klas zagnieżdżonych, wewnętrznych, funkcji, właściwości).

Przykład:

// Plik: example.kt

private const val PRIVATE_CONSTANT = 1 // Widoczne tylko w tym pliku

internal fun internalFunction() { // Widoczne tylko w obrębie modułu
    println("Wywołano funkcję wewnętrzną")
}

open class BaseClass {
    protected val protectedProperty = "Protected" // Widoczne w tej klasie i jej podklasach

    fun publicMethod() { // Widoczne wszędzie (domyślnie public)
        println("Wywołano metodę publiczną")
    }

    private fun privateMethod() { // Widoczne tylko w tej klasie
        println("Wywołano metodę prywatną")
    }
}

class DerivedClass : BaseClass() {
    fun accessProtected() {
        println("Dostęp do chronionej właściwości: $protectedProperty") // Dostęp do protected
        // privateMethod() // Błąd: private nie widoczne w podklasie
    }
}

fun main() {
    val base = BaseClass()
    base.publicMethod()
    // base.protectedProperty // Błąd: protected nie widoczne poza klasą i jej podklasami

    val derived = DerivedClass()
    derived.accessProtected()

    internalFunction()
    // PRIVATE_CONSTANT // Błąd: private na poziomie górnym widoczne tylko w pliku deklaracji
}
Modyfikator Dostępność Gdzie używać
public Wszędzie Domyślnie, gdy nie określono innego modyfikatora
internal Wewnątrz modułu Dla API w bibliotece lub module
protected Wewnątrz klasy i jej podklas (dla członków) Do tworzenia hierarchii klas z dziedziczeniem
private Wewnątrz pliku (na poziomie górnym); wewnątrz klasy (dla członków) Do ukrywania szczegółów implementacji w pliku lub klasie