Modificateurs de visibilité dans Kotlin

Modificateurs de visibilité à Kotlin

1. introduction

Le langage de programmation Kotlin est basé sur la machine virtuelle Java (JVM). En tant que tel, il doit respecter toutes les règles imposées par la machine virtuelle, y compris les modificateurs de visibilité.

Cependant, il existe des nuances subtiles dans la façon dont le langage implémente ces modificateurs en ce qui concerne le compilateur et dans la structure de notre code. Cet article montrera certaines des similitudes et des différences entre Java et Kotlin à cet égard.

2. Modificateurs de visibilité

Les modificateurs de visibilité sont utilisés pour déterminer quels autres éléments de code ont accès à l'élément en cours de modification. Ils s'appliquent à différents éléments du code, à différents niveaux de portée. La manière dont ces règles sont appliquées peut varier légèrement entre ces différentes utilisations, ce qui peut prêter à confusion.

2.1. Visibilité publique

Le modificateur le plus évident estpublic. C’est peut-être le plus fréquemment utilisé dans l’ensemble de la langue et signifie qu’il n’ya pas de restrictions supplémentaires quant à savoir qui peut voir l’élément modifié.

Unlike Java, in Kotlin there is almost never any need to declare anything as public - c'est le modificateur par défaut utilisé si nous n'en déclarons pas un autre. En dehors de cela, cela fonctionne de la même manière en Kotlin et en Java.

Si nous appliquons le modificateurpublic à un élément de premier niveau - une classe externe ou une fonction ou une variable déclarée directement à l'intérieur d'un package - alors tout autre code peut y accéder. Si nous appliquons le modificateurpublic à un élément imbriqué - une classe interne, ou une fonction ou une variable à l'intérieur d'une classe - alors tout code pouvant accéder au conteneur peut également accéder à cet élément.

Par exemple:

class Public {
    val i = 1

    fun doSomething() {
    }
}

La classePublic est accessible de n'importe où dans toute la base de code,“val i »et« fundoSomething()” sont accessibles depuis tout ce qui peut accéder àPublic.

2.2. Visibilité privée

L'autre modificateur qui est utilisé la plupart du temps estprivate. Cela a presque la signification exactement opposée depublic - cela signifie que personne ne peut y accéder.

En réalité,in Kotlin it means that only code declared inside the same scope can access it. Ceci est subtilement différent de Java simplement parce que Kotlin permet plusieurs déclarations de niveau supérieur dans le même fichier - un élément de niveau supérieur deprivateest accessible par tout le reste du même fichier. Autre que cela les règles sont les mêmes. Par exemple:

Par exemple:

private class Private {
    private val i = 1

    private val doSomething() {
    }
}

La classePrivate n'est accessible qu'à partir du même fichier source,“val i »et« fundoSomething()” ne sont accessibles que depuis l'intérieur de la classePrivate.

2.3. Visibilité protégée

The protected modifier in Kotlin means that it is strictly accessible only by the declaring class and subclasses. C’est la même chose que la plupart des gens s’attendent à ce que Java fonctionne, mais elle est légèrement différente de celle de Java.

En Java, le modificateurprotected permet également d'accéder à l'élément depuis n'importe quoi d'autre dans le même package. Par exemple, étant donné le fichier de classe suivant:

class A {
    protected val i = 1
}

Le fichier suivant fonctionnerait bien dans Kotlin:

class B : A() {
    fun getValue() : Int {
        return i
    }
}

Le fichier suivant fonctionnerait en Java mais ne fonctionnerait pas en Kotlin:

class C {
    fun getValue() : Int {
        val a = A()
        return a.i
    }
}

Et ce qui suit ne fonctionnerait ni en Java ni en Kotlin:

class D {
    fun getValue() : Int {
        val a = A()
        return a.i
    }
}

De plus,in Kotlin protected becomes the default visibility when we are overriding a protected element from a superclass. Cela peut être explicitement changé enpublic si vous le souhaitez et c'est la principale fois que nous devrons déclarer quelque chose comme public explicitement____.

2.4. Visibilité par défaut / privée du package

En Java, il existe un modificateur d'accès appelé «package-private» (également appelé «par défaut»). Ceci est utilisé quand aucun modificateur n'est placé sur l'élément. Cela signifie que n'importe quel code du même paquet peut y accéder, mais pas le code d'un paquet différent, y compris les sous-classes.

Kotlin does not currently have any support for this modifier at all, bien que cela puisse changer à l'avenir. La raison en est qu’elle n’offre aucune protection: tout le monde peut définir du code dans le même package et accéder à nos éléments, même à partir d’un fichier JAR différent.

2.5. Visibilité interne

Kotlin ajoute un nouveau modificateur aux options que Java ne prend pas en charge actuellement -internal. This modifier means that any code declared in the same module that is not otherwise restricted can access this element. (Un module est essentiellement un fichier Jar.)

Ceci est possible en Java en utilisant des éléments tels queOSGi, mais ce n'est pas natif pour le moment. Java 9 apportera certains concepts qui le rendent plus réalisable en permettant d’exporter des identifiants publics de manière sélective.

Cela ajoute un avantage énorme pour l'écriture des API et des implémentations. Nous pouvons écrire nos interfaces API en tant quepublic, notre implémentation principale en tant que classespublic et tout le code de support dont elle dépend en tant queinternal. Cela signifie que le code externe est obligé de passer par l'API et ne peut pas accéder aux internes. Par exemple:

package com.example.modifiers

internal class Internal {
}

class Public {
    internal val i = 1

    internal fun doSomething() {
    }
}

La classeInternal n'est accessible que depuis l'intérieur du même module. “val i” et“fun doSomething()” ne sont également accessibles que depuis l'intérieur du même module, même si la classe dans laquelle ils se trouvent est accessible de n'importe où.

3. Sommaire

Dans cet article, nous avons examiné les modificateurs de visibilité dans Kotlin.

La plupart du temps, les règles de modificateur de visibilité de Kotlin fonctionnent de la même manière que ce que nous attendons de Java. Cependant, il existe une différence majeure - qui est l'introduction du périmètreinternal - qui est très utile pour les projets plus importants.