Kotlinの可視性修飾子 – public、protected、internal、private
このチュートリアルでは、Kotlinプログラミングで利用可能なさまざまな可視性修飾子について説明します。
Kotlinの可視性修飾子
可視性修飾子は、Kotlinのクラス/インタフェース/プロパティ/関数に付加される修飾子であり、そのオブジェクトがどこからアクセス可能かを定義します。 Kotlinのプロパティのセッターには、プロパティとは異なる修飾子を持つことができます。ゲッターには、可視性修飾子を定義することはできません。ゲッターは、プロパティと同じ修飾子を使用します。以下に示すのは、可視性修飾子の一覧です。
- public
- protected
- internal
- private
公開修飾子
パブリック修飾子はKotlinのデフォルトの修飾子です。Javaのpublic修飾子と同様に、宣言はどこからでも見えることを意味します。
class Hello{
}
public class H{
}
fun hi()
public fun hello()
val i = 0
public val j = 5
上記のすべての宣言は、ファイルの最上位にあります。すべてが公開されています。クラスのメンバーの宣言を指定しない場合、それらは公開されます(オーバーライドされていない限り)。
保護された修飾子 (Hogoshita shūshokushi)
Kotlinにおけるプロテクテッド修飾子は、トップレベルの宣言には設定できません。クラス内でプロテクテッドになっている宣言は、そのサブクラス内からのみアクセスすることができます。
open class Pr{
protected val i = 0
}
class Another : Pr{
fun iValue() : Int
{
return i
}
}
Prのサブクラスではないクラスは、明示的に変更しない限り、同じprotected修飾子を持つサブクラスのオーバーライド時に、protectedで宣言されたiにアクセスできない。
open class Pr{
open protected val i = 0
}
class Another : Pr(){
fun iValue() : Int
{
return i
}
override val i = 5 //protected visibility
}
上記で定義されるKotlinのProtected Modifiersの概念は、Javaとは異なります。
内部修飾子
KotlinにはJavaにはない新しい修飾子「internal」があります。宣言をinternalとして設定すると、それは同じモジュール内でのみ利用可能になります。モジュールとは、一緒にコンパイルされる一連のファイルのグループを指します。
internal class A {
}
internal val x = 0
これらは現在のモジュールの外では表示されません。内部修飾子は、特定のライブラリの実装をユーザーから隠す必要がある場合に便利です。これはJavaのパッケージ非公開の可視性を使用しては不可能でした。
プライベート修飾子
プライベート修飾子は、現在のスコープの外での宣言の可視性を許しません。
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はクラスの内部からのみ見えます。私たちは以下の方法で私有コンストラクタを設定できます。
class PRIV private constructor(a: String) {
...
}
デフォルトでは、クラスはパブリックなコンストラクタを持っています。クラスが行くところにコンストラクタが付いていきます。定義自体でコンストラクタの可視性修飾子を設定する必要があります。そのため、KotlinはJavaと異なる方法でprotectedとinternalの修飾子を使用します。また、Javaのデフォルトの修飾子であるパッケージプライベートはKotlinには存在しません。これで、Kotlinの可視性修飾子に関するクイックチュートリアルは終わりです。