In Kotlin ermöglichen Sichtbarkeitsmodifikatoren die Kontrolle über den Zugriff auf Deklarationen: Klassen, Eigenschaften, Funktionen und Top-Level (auf Dateiebene) Entitäten. Im Gegensatz zu Java, wo Modifikatoren nur auf Klassenebene wirken, gelten sie in Kotlin auch für Top-Level-Deklarationen, was wichtig für die Strukturierung großer Projekte und API-Bibliotheken ist.
In Java gibt es keine Sichtbarkeitsmodifikatoren für Funktionen oder Eigenschaften außerhalb von Klassen – alles befindet sich innerhalb einer public (oder package-private) Klasse. In Kotlin ist es üblich, das Projekt anders zu strukturieren, oft befinden sich Funktionen oder Eigenschaften nicht innerhalb einer Klasse, sondern direkt in der Datei.
Oft erwarten Java-Entwickler, dass public standardmäßig genauso funktioniert wie in Java, aber in Kotlin ist eine Top-Level-Funktion (oder Eigenschaft) in allen Modulen sichtbar, wenn nicht anders markiert. Eine inkorrekte Festlegung der Sichtbarkeit kann zu einer lexikalischen Verunreinigung der öffentlichen API, unerwarteter Sichtbarkeit interner Hilfsfunktionen oder zum Fehlen benötigter öffentlicher Funktionen führen.
In Kotlin sind folgende Modifikatoren verfügbar:
Beispiel:
// datei: Foo.kt private fun utilityFun() {} internal val bar: Int = 10 public val baz: Int = 20 // public ist nicht erforderlich fun printValue() { println(bar) }
Kann protected für eine Top-Level-Funktion verwendet werden?
Nein, protected ist nur für Klassen- und Schnittstellenmitglieder relevant, Top-Level-Elemente werden nicht unterstützt.
Wenn eine Top-Level-Funktion mit internal deklariert wird, ist sie dann innerhalb anderer Module sichtbar?
Nein. Sie ist nur innerhalb des aktuellen jar/Gradle-Moduls sichtbar.
Was ist der Unterschied zwischen einer privaten Klasse und einer privaten Top-Level-Funktion?
Beispiel:
// datei: Utils.kt private fun helper() { /* ... */ } // nur in dieser Datei sichtbar internal fun useful() { /* ... */ } // im gesamten Modul sichtbar
Testhilfsmittel sind public deklariert und gelangen somit in das Artefakt, was dem Kunden der Bibliothek schadet — es wird alles sichtbar, was nicht zum öffentlichen API gehört.
Vorteile:
Nachteile:
Interne Funktionen sind als private deklariert, Hilfsmittel mit internal Sichtbarkeit für die allgemeine Verwendung innerhalb des Moduls, nur sorgfältig durchdachte Schnittstellen sind public zugänglich.
Vorteile:
Nachteile: