1. 序章

Kotlinプログラミング言語は、Java仮想マシン(JVM)上に構築されています。 そのため、可視性修飾子を含め、JVMが課すすべてのルールに従う必要があります。

ただし、コンパイラーとコードの構造に関して、言語がこれらの修飾子を実装する方法には微妙な違いがあります。 この記事では、この点に関するJavaとKotlinの類似点と相違点をいくつか紹介します。

2. 可視性修飾子

可視性修飾子は、コードの他のどの要素が変更される要素にアクセスできるかを決定するために使用されます。 これらは、さまざまなレベルのスコープで、コード内のいくつかの異なる要素に適用されます。 これらのルールの適用方法は、これらの異なる用途間でわずかに異なる場合があり、最初は混乱する可能性があります。

2.1. パブリックビジビリティ

最も明白な修飾子はpublicです。 これはおそらく言語全体で最も頻繁に使用され、変更されている要素を誰が見ることができるかについての追加の制限がないことを意味します。

Javaとは異なり、Kotlinではpublicとして宣言する必要はほとんどありません –別の修飾子を宣言しない場合に使用されるデフォルトの修飾子です。 これ以外は、KotlinでもJavaと同じように機能します。

public 修飾子をトップレベルの要素(パッケージ内で直接宣言された外部クラスまたは関数または変数)に適用すると、他のコードからアクセスできます。 public 修飾子をネストされた要素(内部クラス、またはクラス内の関数または変数)に適用すると、コンテナーにアクセスできるすべてのコードがこの要素にもアクセスできます。

例えば:

class Public {
    val i = 1

    fun doSomething() {
    }
}

クラスPublicは、コードベース全体のどこからでもアクセスできます。「vali」と「fundoSomething()」は、にアクセスできるすべてのものからアクセスできます。公開。

2.2. プライベートビジビリティ

ほとんどの場合に使用される他の修飾子は、privateです。 これは、 public とほぼ正反対の意味を持ちます。つまり、誰もアクセスできないということです。

実際には、Kotlinではは、同じスコープ内で宣言されたコードのみがそれにアクセスできることを意味します。 これは、Kotlinが同じファイル内で複数のトップレベル宣言を許可しているという理由だけでJavaとは微妙に異なります。 private トップレベル要素には、同じファイル内の他のすべてのものからアクセスできます。 それ以外はルールは同じです。 例えば:

例えば:

private class Private {
    private val i = 1

    private val doSomething() {
    }
}

クラスPrivateは、同じソースファイル内からのみアクセスできます。「vali」と「fundoSomething()」は、クラス内からのみアクセスできます。 ]プライベート

2.3. 保護された可視性

Kotlinの保護された修飾子は、宣言しているクラスとサブクラスによってのみ厳密にアクセスできることを意味します。 これは、ほとんどの人がJavaの動作を期待しているのと同じですが、Javaの動作とは微妙に異なります。

Javaでは、 protected 修飾子を使用すると、同じパッケージ内の他の要素から要素にアクセスすることもできます。 たとえば、次のクラスファイルがあるとします。

package one;

class A {
    protected val i = 1
}

次のファイルはKotlinで正常に機能します。

package two;

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

次のファイルはJavaでは機能しますが、Kotlinでは機能しません。

package one;

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

そして、以下はJavaでもKotlinでも機能しません。

package two;

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

さらに、スーパークラスから保護された要素をオーバーライドする場合、Kotlinprotectedのがデフォルトの可視性になります。 これは、必要に応じて public に明示的に変更できます。これは、何かを明示的にパブリックとして宣言する必要がある主な場合です。.

2.4. パッケージ-プライベート/デフォルトの可視性

Javaには、「package-private」(「default」とも呼ばれる)と呼ばれるアクセス修飾子があります。 これは、要素に修飾子が配置されていない場合に使用されます。 つまり、同じパッケージ内のすべてのコードはアクセスできますが、サブクラスを含め、別のパッケージ内のすべてのコードはアクセスできません。

Kotlinは現在、この修飾子をまったくサポートしていません。ただし、これは将来変更される可能性があります。 この理由は、保護が提供されていないためです。誰でも同じパッケージでコードを定義し、別のjarファイルからでも要素にアクセスできます。

2.5. 内部の可視性

Kotlinは、Javaが現在サポートしていないオプションinternalに新しい修飾子を追加します。 この修飾子は、他の方法で制限されていない同じモジュールで宣言されたコードがこの要素にアクセスできることを意味します。 (モジュールは基本的にJarファイルです。)

これは、 OSGi などを使用してJavaで可能ですが、現時点ではその言語にネイティブではありません。 Java 9は、パブリックIDを選択的にエクスポートできるようにすることで、より実現可能にするいくつかの概念をもたらします。

これにより、APIと実装を作成するための大きなメリットが追加されます。 APIインターフェースはpublicとして、メイン実装は public クラスとして、依存するすべてのサポートコードはinternalとして記述できます。 これを行うと、外部コードがAPIを通過するように強制され、内部にアクセスできなくなります。 例えば:

package com.baeldung.modifiers

internal class Internal {
}

class Public {
    internal val i = 1

    internal fun doSomething() {
    }
}

クラスInternalは、同じモジュール内からのみアクセスできます。「vali」および「fundoSomething()」も、同じモジュール内からのみアクセスできます。それらが含まれているクラスはどこからでもアクセスできますが。

3. 概要

この記事では、Kotlinの可視性修飾子について説明しました。

ほとんどの場合、Kotlinの可視性修飾子ルールはJavaに期待するものと同じように機能します。 ただし、大きな違いがあります。これは、 internal スコープの導入です。これは、大規模なプロジェクトに非常に役立ちます。