可視性修飾子

クラス、オブジェクト、インタフェース、コンストラクタ、関数、プロパティとそのセッターは、可視性修飾子 (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 宣言するクラスを見る そのモジュール内の 任意のクライアントはその internal メンバが見えます
?public ? public 宣言するクラスを見ている任意のクライアントは、public のメンバが見えます

注意 Javaのユーザーへ:Kotlinでは、外部クラスはその内部クラスのprivate メンバが見えません。

protected のメンバをオーバーライドして、明示的に可視性を指定しない場合、オーバーライドするメンバも、protected の可視性になります。

例:

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
}

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のプロジェクト
?<kotlinc>Antタスクの1回の呼び出しでコンパイルされたファイルのセット