可視性修飾子
クラス、オブジェクト、インタフェース、コンストラクタ、関数、プロパティとそのセッターは、 可視性修飾子 (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回の呼び出しでコンパイルされたファイルのセット