【Scala】 アクセス修飾子と限定子
環境 Scala 2.11.6 CentOS7.0
「Scalaスケーラブルプログラミング」(コップ本)メモ
■ アクセス修飾子と限定子(第14章)
アクセス修飾子
修飾子 | アクセス範囲 |
---|---|
private | 非公開メンバー。 メンバーを含むクラス、オブジェクト内のみ。 Javaと異なりインナークラス内メンバーは、同クラス内でも外からはアクセスできない。 ※例1を参照 |
protected | 限定公開メンバー。 クラスのサブクラスのみ。 Javaと異なり、パッケージが同じでも他のクラスからはアクセスできない。 ※例2を参照 |
なし | 公開メンバー。public という修飾子はなく、修飾子の無い物は全て公開になる。 |
限定子
限定子 | アクセス範囲 |
---|---|
private[X] | Xはパッケージ、クラス、シングルトンオブジェクトを指し、指定範囲まで非公開、protectedの場合は限定公開となる。 わかりやすく言うと、X以下まではアクセス可能になる。 ※例3を参照 |
private[this] | オブジェクト非公開。その定義を含むオブジェクトの中からのみアクセス可能。private[X]などと組み合わせて使う事で、書くアクセスを細かく設定できる。 ※例4を参照 |
例1:private修飾子
1) 定義しているクラス内ではアクセス可能
2) インナークラスInner
に定義されているprivate
は、外側のOuter
ではアクセスできない。
3) インナークラス内のインナークラスInnerMost
から、Inner
のprivate
へはアクセス可能。
class Outer { private val foo = "FOO" class Inner { private def bar() = println("BAR") class InnerMost { bar() } new InnerMost } println(foo) // 1) FOO (new Inner).bar // 2) error: method bar in class Inner cannot be accessed in Outer.this.Inner new Inner // 3) Bar }
例2:protected修飾子
1) サブクラスからはアクセス可能 2) 同パッケージ内でも、外部クラスからはアクセス不可
package p { class Super { protected def foo() {println("FOO")} } class Sub extends Super { foo() // 1) FOO } class Other { (new Super).foo() // 2) error: method foo in class Super cannot be accessed in p.Super } }
例3:限定子 private[X]
Inner.bar()
にprivate[Outer]
と限定子を指定しているため、Outer
内ではどこでもアクセス可能。
protected
の場合も同様に[X]
を指定することで、[X]
まではアクセス可能になる。
class Outer { private val foo = "FOO" class Inner { private[Outer] def bar() = println("BAR") } class Other { (new Inner).bar } (new Inner).bar // BAR new Other // BAR }
例4:限定子 private[this]
1) class Inner
がprivate[Outer]
のため、アクセス可能。
2) private[this]
があるため、class Inner
内でのみアクセス可能。
class Outer { private val foo = "FOO" private[Outer] class Inner { def bar = println("BAR") private[this] def baz= println("BAZ") } (new Inner).bar // 1) BAR (new Inner).baz // 2) error: value baz is not a member of Outer.this.Inner }