可視性修飾子
クラス、オブジェクト、インタフェース、コンストラクタ、関数、プロパティとそのセッターは、 可視性修飾子 (visibility modifiers) を持つことができます。ゲッターは常にプロパティと同じ可視性を持ちます。
Kotlinには4つの可視性修飾子があります: private , protected , internal , public 。
明示的な修飾子がない場合に使用されるデフォルトの可視性は、public です。
このページでは、様々な種類のスコープ宣言でこれらの修飾子がどう適用されるかを学びます。
パッケージ
関数、プロパティやクラス、オブジェクトやインターフェースは、「トップレベル」、つまり、パッケージ内部で直接宣言することができます。
// ファイル名: example.kt
package foo
fun baz() {}
class Bar {}
- 可視性修飾子を何も指定しない場合は、宣言がどこでも見える
publicがデフォルトして使用されます。 privateとして宣言すると、その宣言を含むファイルの中でのみ見えますinternalとして宣言すると、同じモジュール内のどこからでも見えますprotectedはトップレベルの宣言では使用できません
別のパッケージから可視なトップレベルの宣言を使うには、インポートをしなくてはいけません。
例:
// ファイル名: example.kt
package foo
private fun foo() {} // example.kt の中で見える
public var bar: Int = 5 // プロパティはどこでも見える
private set // セッターは example.kt の中でのみ見える
internal val baz = 6 // 同じモジュール内でのみ見える
クラスのメンバ
クラス内で宣言されたメンバの場合:
privateはそのクラス内(そのすべてのメンバーを含む)でのみ見えるprotected–privateと同じ + サブクラス内でも見えますinternal– そのモジュール内の 任意のクライアントはそのinternalメンバが見えますpublic–public宣言するクラスが見える任意のクライアントは、publicのメンバが見えます
Kotlinでは、外部クラスはその内部クラスのprivate メンバが見えません。
protected や internal のメンバをオーバーライドして、明示的に可視性を指定しない場合、
オーバーライドしたメンバも、オーバーライド元と同じ可視性になります。
例:
open class Outer {
private val a = 1
protected open val b = 2
internal val c = 3
val d = 4 // デフォルトで public
protected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// a は見えない
// b, c, d は見える
// Nested と e は見える
override val b = 5 // 'b' は protected
override val c = 7 // 'c' は internal
}
class Unrelated(o: Outer) {
// o.a, o.b は見えない
// o.c and o.d は見える(同じモジュール)
// Outer.Nested, Nested::e は見えない
}
コンストラクタ
クラスのプライマリコンストラクタの可視性を指定したい場合は、次の構文を使ってください:
明示的に constructor* キーワードを付加しなければいけません
class C private constructor(a: Int) { ... }
この例では、コンストラクタは private です。
デフォルトでは、すべてのコンストラクタが public です。これにより、そのクラスが見える場所であればどこからでもそのコンストラクタを見ることができます。(これはつまり、 internal クラスのコンストラクタは、同じモジュール内でのみ見えるという事です)。
ローカル宣言
ローカル変数、関数やクラスは、可視性修飾子を持つことはできません。
モジュール
internal 可視性修飾子は、メンバが同じモジュールで見えることを意味します。
具体的には、モジュールは一緒にコンパイルされるKotlinのファイルの集まりです:
- IntelliJ IDEAモジュール
- Mavenやプロジェクト
- Gradleのソースセット(例外は
testソースセットがmainのinternalの宣言にアクセス出来る所) - <kotlinc>Antタスクの1回の呼び出しでコンパイルされたファイルのセット