Skip to content

視認性修飾子

クラス、オブジェクト、インターフェース、コンストラクタ、関数、およびプロパティとそのセッターは、視認性修飾子を持つことができます。 ゲッターは常に、対応するプロパティと同じ視認性を持ちます。

Kotlinには、privateprotectedinternalpublicの4つの視認性修飾子があります。 デフォルトの視認性はpublicです。

このページでは、これらの修飾子が異なる種類の宣言スコープにどのように適用されるかを学びます。

パッケージ

関数、プロパティ、クラス、オブジェクト、インターフェースは、パッケージ内に直接「トップレベル」で宣言できます。

kotlin
// file name: example.kt
package foo

fun baz() { ... }
class Bar { ... }
  • 視認性修飾子を使用しない場合、デフォルトでpublicが使用されます。これは、宣言がどこからでも見えることを意味します。
  • 宣言をprivateとマークした場合、その宣言を含むファイル内でのみ可視になります。
  • internalとマークした場合、同じモジュール内のどこからでも可視になります。
  • protected修飾子は、トップレベル宣言には使用できません。

他のパッケージから可視なトップレベル宣言を使用するには、その宣言をインポートする必要があります。

例:

kotlin
// file name: example.kt
package foo

private fun foo() { ... } // visible inside example.kt

public var bar: Int = 5 // property is visible everywhere
    private set         // setter is visible only in example.kt
    
internal val baz = 6    // visible inside the same module

クラスメンバー

クラス内で宣言されたメンバーについて:

  • privateは、そのメンバーがこのクラス内でのみ(そのすべてのメンバーを含め)可視であることを意味します。
  • protectedは、そのメンバーがprivateとマークされたものと同じ視認性を持つことを意味しますが、サブクラスからも可視です。
  • internalは、宣言元のクラスを見ることができるこのモジュール内の任意のクライアントが、そのinternalメンバーを見ることができることを意味します。
  • publicは、宣言元のクラスを見ることができる任意のクライアントが、そのpublicメンバーを見ることができることを意味します。

Kotlinでは、外側のクラスは内部クラスのプライベートメンバーを見ることができません。

protectedまたはinternalメンバーをオーバーライドする際に、視認性を明示的に指定しない場合、オーバーライドするメンバーも元のメンバーと同じ視認性を持ちます。

例:

kotlin
open class Outer {
    private val a = 1
    protected open val b = 2
    internal open val c = 3
    val d = 4  // public by default
    
    protected class Nested {
        public val e: Int = 5
    }
}

class Subclass : Outer() {
    // a is not visible
    // b, c and d are visible
    // Nested and e are visible

    override val b = 5   // 'b' is protected
    override val c = 7   // 'c' is internal
}

class Unrelated(o: Outer) {
    // o.a, o.b are not visible
    // o.c and o.d are visible (same module)
    // Outer.Nested is not visible, and Nested::e is not visible either 
}

コンストラクタ

クラスのプライマリコンストラクタの視認性を指定するには、以下の構文を使用します。

明示的にconstructorキーワードを追加する必要があります。

kotlin
class C private constructor(a: Int) { ... }

ここでは、コンストラクタはprivateです。デフォルトでは、すべてのコンストラクタはpublicであり、事実上、クラスが可視であるどこからでも可視であることを意味します(これは、internalクラスのコンストラクタが同じモジュール内でのみ可視であることを意味します)。

シールドクラスの場合、コンストラクタはデフォルトでprotectedです。詳細については、シールドクラスを参照してください。

ローカル宣言

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

モジュール

internal視認性修飾子は、そのメンバーが同じモジュール内で可視であることを意味します。より具体的には、 モジュールとは、以下に示すように、まとめてコンパイルされるKotlinファイルのセットです。

  • IntelliJ IDEAモジュール。
  • Mavenプロジェクト。
  • Gradleソースセット(ただし、testソースセットはmainの内部宣言にアクセスできるという例外があります)。
  • <kotlinc> Antタスクの1回の呼び出しでコンパイルされるファイルのセット。