Edit Page

可視性修飾子

クラス、オブジェクト、インタフェース、コンストラクタ、関数、プロパティとそのセッターは、 可視性修飾子 (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 はそのクラス内(そのすべてのメンバーを含む)でのみ見える
  • protectedprivate と同じ + サブクラス内でも見えます
  • internalそのモジュール内の 任意のクライアントはその internal メンバが見えます
  • publicpublic 宣言するクラスが見える任意のクライアントは、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回の呼び出しでコンパイルされたファイルのセット