Модификаторы видимости в Котлине

Модификаторы видимости в Котлине

1. Вступление

Язык программирования Kotlin построен на виртуальной машине Java (JVM). Таким образом, он должен следовать всем правилам, которые устанавливает JVM, включая модификаторы видимости.

Однако в том, как язык реализует эти модификаторы, есть некоторые тонкие нюансы относительно компилятора и структуры нашего кода. Эта статья покажет некоторые сходства и различия между Java и Kotlin в этом отношении.

2. Модификаторы видимости

Модификаторы видимости используются для определения того, какие другие элементы кода имеют доступ к изменяемому элементу. Они применяются к некоторым различным элементам в коде, на разных уровнях области видимости. Способ применения этих правил может незначительно отличаться между этими различными видами использования, что поначалу может сбивать с толку.

2.1. Общественная видимость

Самый очевидный модификатор -public. Возможно, это наиболее часто используется во всем языке и означает, что нет никаких дополнительных ограничений на то, кто может видеть изменяемый элемент.

Unlike Java, in Kotlin there is almost never any need to declare anything as public - это модификатор по умолчанию, используемый, если мы не объявляем другой. Кроме этого, он работает так же в Kotlin, как и в Java.

Если мы применим модификаторpublic к элементу верхнего уровня - внешнему классу, функции или переменной, объявленным непосредственно внутри пакета, - тогда любой другой код сможет получить к нему доступ. Если мы применим модификаторpublic к вложенному элементу - внутреннему классу, функции или переменной внутри класса - тогда любой код, который может получить доступ к контейнеру, также сможет получить доступ к этому элементу.

Например:

class Public {
    val i = 1

    fun doSomething() {
    }
}

КлассPublic доступен из любого места во всей кодовой базе,“val i »и« fundoSomething()” доступны из всего, что может получить доступ кPublic..

2.2. Частная видимость

Другой модификатор, который используется большую часть времени, - этоprivate. Это имеет почти прямо противоположное значениеpublic - это означает, что никто не может получить к нему доступ.

На самом делеin Kotlin it means that only code declared inside the same scope can access it. Это немного отличается от Java просто потому, что Kotlin допускает несколько объявлений верхнего уровня в одном файле - элемент верхнего уровняprivate может быть доступен всем остальным в том же файле. Кроме этого правила одинаковы. Например:

Например:

private class Private {
    private val i = 1

    private val doSomething() {
    }
}

КлассPrivate доступен только из одного исходного файла,“val i »и« fundoSomething()” доступны только изнутри классаPrivate.

2.3. Защищенная видимость

The protected modifier in Kotlin means that it is strictly accessible only by the declaring class and subclasses. Это то же самое, что большинство людей ожидают, что Java будет работать, но немного отличается от того, как работает Java.

В Java модификаторprotected также разрешает доступ к элементу из чего-либо еще в том же пакете. Например, дан следующий файл класса:

class A {
    protected val i = 1
}

Следующий файл будет хорошо работать в Kotlin:

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

Следующий файл будет работать в Java, но не будет работать в Kotlin:

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

И следующее не будет работать ни в Java, ни в Kotlin:

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

Дополнительноin Kotlin protected becomes the default visibility when we are overriding a protected element from a superclass. При желании это можно явно изменить наpublic, и это основной момент, когда нам нужно явно объявить что-то как общедоступное ____.

2.4. Частный пакет / видимость по умолчанию

В Java есть модификатор доступа, известный как «частный пакет» (также называемый «по умолчанию»). Это используется, когда модификатор не размещен на элементе. Это означает, что любой код в том же пакете может получить к нему доступ, но любой код в другом пакете не может, включая подклассы.

Kotlin does not currently have any support for this modifier at all, хотя это может измениться в будущем. Причина этого заключается в том, что он не предлагает никакой защиты - любой может определить код в одном и том же пакете и получить доступ к нашим элементам, даже из другого файла JAR.

2.5. Внутренняя видимость

Kotlin добавляет новый модификатор к параметрам, которые Java в настоящее время не поддерживает -internal. This modifier means that any code declared in the same module that is not otherwise restricted can access this element. (Модуль по сути является файлом Jar.)

Это возможно в Java с использованием таких вещей, какOSGi, но в настоящее время это не является родным для языка. В Java 9 появятся некоторые концепции, которые сделают его более достижимым благодаря возможности выборочного экспорта открытых идентификаторов.

Это добавляет огромное преимущество для написания API и реализаций. Мы можем написать наши интерфейсы API какpublic, нашу основную реализацию как классыpublic, а весь код поддержки, от которого он зависит, какinternal. Это означает, что внешний код вынужден проходить через API и не может получить доступ к внутренним компонентам. Например:

package com.example.modifiers

internal class Internal {
}

class Public {
    internal val i = 1

    internal fun doSomething() {
    }
}

КлассInternal доступен только изнутри того же модуля. “val i” и“fun doSomething()” также доступны только изнутри одного модуля, хотя к классу, в котором они находятся, можно получить доступ из любого места.

3. Резюме

В этой статье мы рассмотрели модификаторы видимости в Kotlin.

В большинстве случаев правила модификатора видимости в Kotlin работают так же, как мы ожидаем от Java. Однако есть существенное отличие - введение области действияinternal, которая очень полезна для более крупных проектов.