Skip to content

可視性修飾子

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

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

このページでは、修飾子が異なる種類の宣言スコープにどのように適用されるかについて説明します。

パッケージ

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

kotlin
// file name: example.kt
package foo

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

NOTE

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

例:

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メンバーを見ることができることを意味します。

NOTE

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 
}

コンストラクタ

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

NOTE

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

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

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

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

ローカル宣言

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

モジュール

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

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