In Kotlin, i modificatori di visibilità consentono di controllare l'accesso alle dichiarazioni: classi, proprietà, funzioni e entità di livello superiore (a livello di file). A differenza di Java, dove i modificatori operano solo a livello di classe, in Kotlin funzionano anche per le dichiarazioni di livello superiore, il che è importante per strutturare grandi progetti e API di librerie.
In Java non ci sono modificatori di visibilità per funzioni o proprietà al di fuori della classe: tutto è racchiuso all'interno di una classe public (o package-private). In Kotlin è comune strutturare il progetto in modo diverso, spesso una funzione o una proprietà si trova non all'interno di una classe, ma direttamente nel file.
Spesso gli sviluppatori Java si aspettano che public per impostazione predefinita funzioni come in Java, ma in Kotlin, una funzione di livello superiore (o proprietà) è visibile in tutti i moduli, se non diversamente contrassegnata. Una definizione scorretta della visibilità può portare a un inquinamento lessicale dell'API pubblica, una disponibilità inaspettata di utility interne, oppure all'inaccessibilità di funzioni pubbliche necessarie.
In Kotlin sono disponibili i seguenti modificatori:
Esempio:
// file: Foo.kt private fun utilityFun() {} internal val bar: Int = 10 public val baz: Int = 20 // public non è necessario fun printValue() { println(bar) }
È possibile utilizzare protected per una funzione di livello superiore?
No, protected è pertinente solo ai membri di classi/interfacce, le entità di livello superiore non supportano tali elementi.
Se dichiaro una funzione di livello superiore con internal, sarà visibile all'interno di altri moduli?
No. Sarà visibile solo all'interno del modulo jar/Gradle corrente.
Qual è la differenza tra una classe privata e una funzione di livello superiore privata?
Esempio:
// file: Utils.kt private fun helper() { /* ... */ } // visibile solo in questo file internal fun useful() { /* ... */ } // visibile in tutto il modulo
Le utility di test sono dichiarate public e dunque entrano nell'artefatto, ostacolando il client della libreria: diventa visibile tutto ciò che non è legato all'API pubblica.
Pro:
Contro:
Funzioni interne dichiarate private, utility con visibilità interna per uso comune all'interno del modulo, solo interfacce attentamente progettate hanno accesso pubblico.
Pro:
Contro: