English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kotlin 可視性修飾子

この記事では、Kotlinでの4種類のアクセス修飾子があり、それらは異なる状況での動作方法について説明します。

アクセス修飾子は、クラス、オブジェクト、インターフェース、コンストラクタ、関数、プロパティおよびそのセッターのアクセス(可視性)を設定するために使用されるキーワードです。(ゲッターのアクセス修飾子は設定できません。なぜなら、それらは常にプロパティと同じアクセスを持っているからです。)

Kotlin クラスとオブジェクト文章では、あなたはpublicおよびprivateというアクセス修飾子について簡単に学びました。この記事では、さらにprotectedおよびinternal(そしてpublicおよびprivate)について詳しく説明します。

パッケージ内の可见性修飾子

パッケージは、関連する関数、属性、クラス、オブジェクト、インターフェースを組織します。

修飾子説明
publicどこでも可见
private宣言が含まれるファイル内で可见
internal同一モジュール内で可见(一緒にコンパイルされる Kotlin ファイルのセット)
protectedパッケージには使用できません(サブクラス用)

注意:可见性修飾子が指定されていない場合、デフォルトでは public になります。

例を示しましょう:

//ファイル名: hello.kt
package test
fun function1() {}   //デフォルトではパブリックで、どこでも見えます
private fun function2() {}   //hello.kt 内で可见
internal fun function3() {}   //同一モジュール内で見えます
var name = "Foo"   //どこでも見えます
    get() = field   //hello.kt 内で可见(属性と同じ)
    private set(value) {   //hello.kt 内で可见
        field = value
    }
private class class1 {}   //hello.kt 内で可见

クラスおよびインターフェース内の可见性修飾子

以下は、可见性修飾子がクラス内のメンバー(関数、属性)に対してどのように働くかの説明です:

修飾子説明
public宣言されたクラスを見ることができるすべてのクライアントに見えます
privateクラス内のみで見えます
protectedクラスおよびその子クラス内で見えます
internalモジュール内のすべてのクライアントに宣言されたクラスが見えます

注意:派生クラスで protected メンバーをオーバーライドし、その可见性を指定しない場合、その可见性も protected になります。

例を示しましょう:

open class Base() {
    var a = 1                 //デフォルトではパブリック
    private var b = 2         // Base クラスはプライベート
    protected open val c = 3  //Base クラスと Derived クラスに見えます
    internal val d = 4        //同一モジュール内で見えます
    protected fun e() { }     //Base クラスと Derived クラスに見えます
}
class Derived: Base() {
    // a、c、d、および e() Base クラスのすべての属性は見えます
    // b は見えません
    override val c = 9        // c は protected
}
fun main(args: Array<String>) {
    val base = Base()
    //base.aとbase.dは見えます
    // base.b、base.c と base.e() は見えません
    val derived = Derived()
    // derived.c は不可視
}

コンストラクタの可視性を変更する

デフォルトでは、コンストラクタの可視性はpublicですが、変更できます。これには、明示的にconstructorキーワードを追加する必要があります。

以下の例では、コンストラクタはデフォルトでpublicです:

class Test(val a: Int) {
    // code
}

その可視性を変更するには以下の方法を使用できます。

class Test private constructor(val a: Int) {
    // code
}

ここでのコンストラクタはprivateです。

注意:  Kotlinでは、ローカル関数、変数、クラスには可視性修飾子を持つことができません。