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 |