Scala-アクセス修飾子
この章では、Scalaアクセス修飾子について説明します。パッケージ、クラス、またはオブジェクトのメンバーには、privateおよびprotectedのアクセス修飾子でラベルを付けることができます。これら2つのキーワードのいずれも使用していない場合、アクセスはpublicと見なされます。これらの修飾子は、メンバーへのアクセスをコードの特定の領域に制限します。アクセス修飾子を使用するには、次のセクションで説明するように、パッケージ、クラス、またはオブジェクトのメンバーの定義にそのキーワードを含めます。
プライベートメンバー
プライベートメンバーは、メンバー定義を含むクラスまたはオブジェクト内でのみ表示されます。
以下は、プライベートメンバーを説明するためのサンプルコードスニペットです-
例
class Outer {
class Inner {
private def f() { println("f") }
class InnerMost {
f() // OK
}
}
(new Inner).f() // Error: f is not accessible
}
Scalaでは、アクセス(新しい内部)。fはInnerでプライベートとして宣言されており、アクセスはクラスInner内からではないため、f()は不正です。対照的に、クラスInnermostのfへの最初のアクセスは、そのアクセスがクラスInnerの本体に含まれているため、OKです。Javaは、外部クラスが内部クラスのプライベートメンバーにアクセスできるようにするため、両方のアクセスを許可します。
保護されたメンバー
保護されたメンバーには、メンバーが定義されているクラスのサブクラスからのみアクセスできます。
以下は、保護されたメンバーを説明するためのサンプルコードスニペットです-
例
package p {
class Super {
protected def f() { println("f") }
}
class Sub extends Super {
f()
}
class Other {
(new Super).f() // Error: f is not accessible
}
}
fは「Super」クラスで保護されていると宣言されており、「Sub」クラスはSuperのサブクラスであるため、クラスSubのfへのアクセスはOKです。対照的に、クラス「Other」はクラス「Super」から継承しないため、「Other」クラスのfへのアクセスは許可されません。Javaでは、「Other」クラスが「Sub」クラスと同じパッケージに含まれているため、後者のアクセスは引き続き許可されます。
パブリックメンバー
プライベートおよび保護されたメンバーとは異なり、パブリックメンバーにパブリックキーワードを指定する必要はありません。パブリックメンバー用の明示的な修飾子はありません。このようなメンバーには、どこからでもアクセスできます。
以下は、パブリックメンバーを説明するためのサンプルコードスニペットです-
例
class Outer {
class Inner {
def f() { println("f") }
class InnerMost {
f() // OK
}
}
(new Inner).f() // OK because now f() is public
}
保護の範囲
Scalaのアクセス修飾子は、修飾子で拡張できます。private [X]またはprotected [X]の形式の修飾子は、アクセスがプライベートまたは保護された「最大」Xであることを意味します。ここで、Xは、囲んでいるパッケージ、クラス、またはシングルトンオブジェクトを示します。
次の例を考えてみましょう-
例
package society {
package professional {
class Executive {
private[professional] var workDetails = null
private[society] var friends = null
private[this] var secrets = null
def help(another : Executive) {
println(another.workDetails)
println(another.secrets) //ERROR
}
}
}
}
Note −上記の例からの以下の点−
変数workDetailsは、同封のパッケージプロフェッショナル内のすべてのクラスからアクセスできます。
可変の友達は、同封のパッケージ社会内のどのクラスにもアクセスできます。
変数シークレットは、インスタンスメソッド(this)内の暗黙的なオブジェクトでのみアクセスできます。