可視性修飾子
クラス、オブジェクト、インターフェース、コンストラクタ、および関数は、プロパティとそのセッターと同様に、visibility modifiers(可視性修飾子)を持つことができます。 ゲッターは常に、そのプロパティと同じ可視性を持ちます。
Kotlin には、private
、protected
、internal
、public
の 4 つの可視性修飾子があります。
デフォルトの可視性は public
です。
このページでは、これらの修飾子がさまざまな型の宣言スコープにどのように適用されるかを学びます。
パッケージ
関数、プロパティ、クラス、オブジェクト、およびインターフェースは、パッケージ内の "トップレベル" で直接宣言できます。
// file name: example.kt
package foo
fun baz() { ... }
class Bar { ... }
- 可視性修飾子を使用しない場合、デフォルトで
public
が使用されます。これは、宣言がどこからでも見えることを意味します。 - 宣言を
private
としてマークすると、その宣言を含むファイル内でのみ表示されます。 internal
としてマークすると、同じモジュール内のどこからでも表示されます。protected
修飾子は、トップレベルの宣言では使用できません。
別のパッケージから可視のトップレベル宣言を使用するには、それをimportする必要があります。
例:
// 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 では、外側のクラスは内側のクラスの private メンバーを参照できません。
protected
または internal
メンバーをオーバーライドし、可視性を明示的に指定しない場合、オーバーライドするメンバーも元のメンバーと同じ可視性を持ちます。
例:
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
キーワードを追加する必要があります。
class C private constructor(a: Int) { ... }
ここでは、コンストラクタは private
です。デフォルトでは、すべてのコンストラクタは public
であり、これは事実上、クラスが表示されるすべての場所でコンストラクタが表示されることを意味します(これは、internal
クラスのコンストラクタは、同じモジュール内でのみ表示されることを意味します)。
sealed classes の場合、コンストラクタはデフォルトで protected
になります。詳細については、Sealed classesを参照してください。
ローカル宣言
ローカル変数、関数、およびクラスは、可視性修飾子を持つことができません。
モジュール
internal
可視性修飾子は、メンバーが同じモジュール内で可視であることを意味します。より具体的には、モジュールは、一緒にコンパイルされた Kotlin ファイルのセットです。例:
- IntelliJ IDEA モジュール。
- Maven プロジェクト。
- Gradle ソースセット(ただし、
test
ソースセットはmain
の internal 宣言にアクセスできるという例外があります)。 - 1 回の
<kotlinc>
Ant タスクの呼び出しでコンパイルされたファイルのセット。