En Kotlin, les modificateurs de visibilité permettent de contrôler l'accès aux déclarations : classes, propriétés, fonctions et entités de niveau supérieur (au niveau du fichier). Contrairement à Java, où les modificateurs n'agissent qu'au niveau de la classe, en Kotlin ils fonctionnent également pour les déclarations de niveau supérieur, ce qui est important pour structurer de grands projets et des API de bibliothèque.
En Java, il n'existe pas de modificateurs de visibilité pour les fonctions ou propriétés en dehors des classes — tout est contenu dans une classe public (ou package-private). En Kotlin, on structure souvent le projet différemment, où une fonction ou une propriété peut ne pas être dans une classe mais directement dans un fichier.
Les développeurs Java s'attendent souvent à ce que public par défaut fonctionne de la même manière qu'en Java, mais en Kotlin une fonction de niveau supérieur (ou une propriété) est visible dans tous les modules, sauf mention contraire. Une définition incorrecte de la visibilité peut entraîner un encombrement du public API, une accessibilité inattendue des utilitaires internes, ou l'inaccessibilité de fonctions publiques nécessaires.
En Kotlin, les modificateurs suivants sont disponibles :
Exemple :
// fichier : Foo.kt private fun utilityFun() {} internal val bar: Int = 10 public val baz: Int = 20 // public n'est pas obligatoire fun printValue() { println(bar) }
Peut-on utiliser protected pour une fonction de niveau supérieur ?
Non, protected est pertinent uniquement pour les membres de classe/interface, les éléments de niveau supérieur ne le prennent pas en charge.
Si l'on déclare une fonction de niveau supérieur avec internal, sera-t-elle visible dans d'autres modules ?
Non. Elle sera visible uniquement dans le cadre du JAR/module Gradle actuel.
Quelle est la différence entre une classe private et une fonction de niveau supérieur private ?
Exemple :
// fichier : Utils.kt private fun helper() { /* ... */ } // visible uniquement dans ce fichier internal fun useful() { /* ... */ } // visible dans tout le module
Les utilitaires de test sont déclarés public et se retrouvent dans l'artefact, gênant le client de la bibliothèque — tout ce qui ne concerne pas l'API publique devient visible.
Avantages :
Inconvénients :
Les fonctions internes sont déclarées private, les utilitaires avec visibilité internal pour l'utilisation générale à l'intérieur du module, seules des interfaces soigneusement pensées ont un accès public.
Avantages :
Inconvénients :