読者です 読者をやめる 読者になる 読者になる

takafumi blog

日々の勉強メモ

【Scala】 アクセス修飾子と限定子

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から、Innerprivateへはアクセス可能。

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 Innerprivate[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
}     

takafumi-s.hatenablog.com