16.4. Kwalifikowany dostęp prywatny

Istnieje inna forma wykorzystania modyfikatora private, mająca postać private[T], gdzie T jest identyfikatorem pakietu, klasy lub obiektu obejmującego bezpośrednio lub pośrednio modyfikowaną definicję. Taki modyfikator powoduje, że oznaczona nim definicja jest dostępna z kodu znajdującego się wewnątrz tego pakietu, klasy lub obiektu. W przypadku, gdy T oznacza klasę, dostęp jest również możliwy z jej obiektu towarzyszącego. W przypadku, gdy T oznacza obiekt, dostęp jest również możliwy z jej klasy towarzyszącej.

Plik QualifiedPrivate1.scala:
object Hello {
  object Hi {
    private[Hello] def speak = println("Hi!") 
  }
  def hi = Hi.speak 
}
class Hello {
  def hi2 = Hello.Hi.speak 
}

W przykładzie z pliku QualifiedPrivate1.scala, w definicji metody hi z wiersza można się odwołać do metody speak obiektu Hi, mimo jej oznaczenia modyfikatorem private (wiersz ), gdyż ten modyfikator jest kwalifikowany obiektem Hello, a metoda hi jest definiowana w tym właśnie obiekcie. Możliwy jest również dostęp do metody speak z klasy Hello w wierszu . Natomiast dostęp do metody speak spoza obiektu Hello i jej klasy towarzyszącej nie jest możliwy (wiersz ).

scala> Hello.hi
Hi!

scala> (new Hello).hi2
Hi!
scala> Hello.Hi.speak 
<console>:11: error: method speak in object Hi cannot be accessed in object Hello.Hi
       Hello.Hi.speak
                ^

Błędem jest kwalifikowanie modyfikatora private nazwą nie dotyczącą obejmującego pakietu, klasy lub obiektu.

Plik QualifiedPrivate2.scala:
class Hello
object Hi {
  private[Hello] def speak = println("Hi!")
}

W przykładzie z pliku QualifiedPrivate2.scala obiekt Hi jest zdefiniowany poza klasą Hello, co skutkuje błędem kompilacji.

$ scalac QualifiedPrivate2.scala
QualifiedPrivate2.scala:3: error: Hello is not an enclosing class
  private[Hello] def speak = println("Hi!")
                     ^
one error found

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.