Kotlin / Programming

ザクっと理解するKotlin 可視性修飾子(Visibility Modifiers)

publicやprivateなどの可視性は使われる場所により参照範囲が変わります。
この記事では各場所による可視性の違いを、Kotlinの公式文章をもとに紹介しています。

可視性修飾子とは

クラス、関数、プロパティなどのプログラムの要素がどの範囲でアクセス可能かを制御する概念です。

パッケージ (Packages)

関数プロパティクラス、オブジェクト、インターフェースはパッケージ内の最上位(top-level)で宣言できます。

publicデフォルトであり、どこからでも参照可能です。
private宣言しているファイル内でのみ参照可能です。
internalモジュール内であればどこからでも参照可能です。
protected最上位での宣言では使用できません。
// 可視性がついていないものは自動的にpublicになる
fun toplevelFunction() {
    println("Top-level Function")
}

private val toplevelProperty = "Top-level Property"

fun main() {
    toplevelFunction() // 結果: Top-level Function
    println(toplevelProperty) // 結果: Top-level Property
}

クラスメンバー

クラス内のメンバー(プロパティや関数)の可視性は下記の通りです。

publicクラスを参照できる場合、どこからでも参照可能です。
privateクラス内からのみ参照可能です。
internalモジュール内であればどこからでも参照可能です。
protectedprivateと同じですが、サブクラス内からも参照可能です。
open class Class01 {
    val a = 1 // 初期値はpublic
    private val b = 2
    internal open val c = 3
    protected open val d = 4
    
    protected class NestedClass01 {
        public val e: Int = 5
    }
}

class Subclass01 : Class01() {
    fun printProp() {
        println(a) // public: 参照可能
        // println(b) // private: 参照不可能
        println(c) // internal: 参照可能
        println(d) // protected: 参照可能
        println(NestedClass01().e) // protected subclass: 参照可能
    }
}

class Class02 {
    fun printProp() {
        val class01 = Class01()
        println(class01.a) // public: 参照可能
        // println(class01.b) // private: 参照不可能
        println(class01.c) // internal: 参照可能
        // println(class01.d) // protected: 参照不可能
        // println(class01.NestedClass01().e) // protected subclass: 参照不可能
    }
}

fun main() {
    val subClass01 = Subclass01()
    subClass01.printProp()
    
    println("----------")
    
    val class02 = Class02()
    class02.printProp()
}

コンストラクタ

プライマリコンストラクタは下記のように可視性を設定します。

class Class01 private constructor(a: Int) { ... }

コンストラクタはデフォルトではpublicに設定され、クラスが見える範囲のどこからでもアクセスできます。
これは、internalクラスのコンストラクタは同じモジュール内でのみ見えるということを意味します。

ローカルの宣言

ローカルの変数、関数、クラスは可視性を設定できません。

fun main() {
    fun function01() {
        println("可視性の設定不可")
    }
    
    function01() // 結果: 可視性の設定不可
}

モジュール

internalは同じモジュール内であれば参照可能です。
モジュールとは一緒にコンパイルされるKotlinのファイルを指します。
以下が例です。

・IntelliJ IDEA モジュール

・Mavenプロジェクト

・Gradleのソースセット

・<kotlinc> Antタスクの1回の呼び出しでコンパイルされたファイルのセットです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です