Kotlinの可視性修飾子 – public、protected、internal、private

このチュートリアルでは、Kotlinプログラミングで利用可能なさまざまな可視性修飾子について説明します。

Kotlin可視性修飾子

可視性修飾子は、Kotlinのクラス/インターフェース/プロパティ/関数に追加される修飾子であり、その要素がどこから見えるか、どこからアクセスできるかを定義します。Kotlinのプロパティのセッターは、プロパティとは異なる修飾子を持つことができます。ゲッターには可視性修飾子を定義することはできません。ゲッターは、プロパティと同じ修飾子を使用します。以下は、可視性修飾子の一覧です:

  • public
  • protected
  • internal
  • private

Public Modifier

A Public Modifier is the default modifier in Kotlin. Just like the Java public modifier, it means that the declaration is visible everywhere.


class Hello{
}

public class H{
}

fun hi()
public fun hello()

val i = 0
public val j = 5

上記のすべての宣言は、ファイルのトップレベルにあります。すべてがpublicです。クラスのメンバーの宣言を指定しない場合、それらはpublicになります(オーバーライドされていない限り)。

Protected Modifier

A Protected Modifier in Kotlin: CANNOT be set on top-level declarations. Declarations that are protected in a class, can be accessed only in their subclasses.

open class Pr{
    protected val i = 0
}

class Another : Pr{

    fun iValue() : Int
    {
        return i
    }
}

Prのサブクラスではないクラスは、protectedで宣言されたiにアクセスすることはできません。サブクラスでオーバーライドされる場合、protected修飾子は明示的に変更しない限り、同じprotected修飾子を持ちます。

open class Pr{
    open protected val i = 0
}

class Another : Pr(){

    fun iValue() : Int
    {
        return i
    }
    
    override val i = 5 //protected visibility
}

上記で定義されたKotlinのProtected修飾子の概念は、Javaのそれと異なります。

Internal修飾子

Internalは、Javaには存在しないKotlinで利用可能な新しい修飾子です。宣言をinternalと設定すると、同じモジュール内でのみ利用可能になります。Kotlinでのモジュールとは、一緒にコンパイルされるファイルのグループを指します。

internal class A {
}

internal val x = 0

これらは現在のモジュールの外部では表示されません。Internal修飾子は、特定のライブラリの実装をユーザーから隠す必要がある場合に便利です。これはJavaのパッケージプライベートの可視性では実現できませんでした。

Private修飾子

Private修飾子は、宣言が現在のスコープの外部で表示されないようにします。

var setterVisibility: String = "abc"
private set

open class Pr{
    open protected val i = 0

    fun iValue() : Int
    {
        setterVisibility = 10
        return setterVisibility
    }
}

Kotlinでは複数のトップレベル定義を許可しているため、上記のコードは機能します。以下のコードは機能しません。

private open class ABC{
    private val x = 6
}

private class BDE : ABC()
{
    fun getX()
    {
        return x //x cannot be accessed here.
    }
}

x is visibile only from inside its class. We can set private constructors in the following way:

class PRIV private constructor(a: String) {
 ... 
}

{
“error”: “Upstream error…”
}

Source:
https://www.digitalocean.com/community/tutorials/kotlin-visibility-modifiers-public-protected-internal-private