W Kotlinie modyfikatory widoczności umożliwiają kontrolowanie dostępu do deklaracji: klas, właściwości, funkcji oraz elementów na najwyższym poziomie (na poziomie pliku). W przeciwieństwie do Javy, gdzie modyfikatory działają tylko na poziomie klasy, w Kotlinie działają również dla deklaracji na najwyższym poziomie, co jest ważne dla strukturyzacji dużych projektów i API bibliotek.
W Javie nie ma modyfikatorów widoczności dla funkcji lub właściwości poza klasą – wszystko znajduje się w publicznej (lub pakietowo-prywatnej) klasie. W Kotlinie przyjęto inne podejście do strukturyzacji projektu, często funkcja lub właściwość znajduje się nie wewnątrz klasy, ale bezpośrednio w pliku.
Często programiści Javy oczekują, że publiczne domyślnie będzie działać tak samo jak w Javie, ale w Kotlinie funkcja (lub właściwość) na najwyższym poziomie jest widoczna we wszystkich modułach, chyba że oznaczona jest inaczej. Niewłaściwe określenie widoczności może prowadzić do zanieczyszczenia publicznego API, nieoczekiwanej dostępności wewnętrznych narzędzi lub niedostępności potrzebnych publicznych funkcji.
W Kotlinie dostępne są następujące modyfikatory:
Przykład:
// plik: Foo.kt private fun utilityFun() {} internal val bar: Int = 10 public val baz: Int = 20 // public nie jest wymagany fun printValue() { println(bar) }
Czy można użyć protected dla funkcji na najwyższym poziomie?
Nie, protected dotyczy tylko członków klasy/interfejsu, elementy na najwyższym poziomie tego nie wspierają.
Jeśli zadeklaruję funkcję na najwyższym poziomie z internal, czy będzie widoczna w innych modułach?
Nie. Będzie widoczna tylko w granicach bieżącego modułu jar/Gradle.
Czym różni się private class od private top-level function?
Przykład:
// plik: Utils.kt private fun helper() { /* ... */ } // widoczny tylko w tym pliku internal fun useful() { /* ... */ } // widoczny w całym module
Funkcje pomocnicze są zadeklarowane jako public, przez co trafiają do artefaktu, przeszkadzając klientowi biblioteki – staje się widoczne wszystko, co nie należy do publicznego API.
Zalety:
Wady:
Funkcje wewnętrzne są zadeklarowane jako private, narzędzia z widocznością internal do wspólnego użytku w module, tylko starannie przemyślane interfejsy mają dostęp publiczny.
Zalety:
Wady: