視認性修飾子
クラス、オブジェクト、インターフェース、コンストラクタ、関数、およびプロパティとそのセッターは、視認性修飾子を持つことができます。 ゲッターは常に、対応するプロパティと同じ視認性を持ちます。
Kotlinには、private、protected、internal、publicの4つの視認性修飾子があります。 デフォルトの視認性はpublicです。
このページでは、これらの修飾子が異なる種類の宣言スコープにどのように適用されるかを学びます。
パッケージ
関数、プロパティ、クラス、オブジェクト、インターフェースは、パッケージ内に直接「トップレベル」で宣言できます。
// file name: example.kt
package foo
fun baz() { ... }
class Bar { ... }- 視認性修飾子を使用しない場合、デフォルトで
publicが使用されます。これは、宣言がどこからでも見えることを意味します。 - 宣言を
privateとマークした場合、その宣言を含むファイル内でのみ可視になります。 internalとマークした場合、同じモジュール内のどこからでも可視になります。protected修飾子は、トップレベル宣言には使用できません。
他のパッケージから可視なトップレベル宣言を使用するには、その宣言をインポートする必要があります。
例:
// 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メンバーをオーバーライドする際に、視認性を明示的に指定しない場合、オーバーライドするメンバーも元のメンバーと同じ視認性を持ちます。
例:
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クラスのコンストラクタが同じモジュール内でのみ可視であることを意味します)。
シールドクラスの場合、コンストラクタはデフォルトでprotectedです。詳細については、シールドクラスを参照してください。
ローカル宣言
ローカル変数、関数、クラスは視認性修飾子を持つことができません。
モジュール
internal視認性修飾子は、そのメンバーが同じモジュール内で可視であることを意味します。より具体的には、 モジュールとは、以下に示すように、まとめてコンパイルされるKotlinファイルのセットです。
- IntelliJ IDEAモジュール。
- Mavenプロジェクト。
- Gradleソースセット(ただし、
testソースセットはmainの内部宣言にアクセスできるという例外があります)。 <kotlinc>Antタスクの1回の呼び出しでコンパイルされるファイルのセット。
