16.3. Uprawnienia prywatne w ramach obiektu

Jeśli definicja składowej klasy poprzedzona jest modyfikatorem private[this], to taka składowa jest dostępna tylko z danej instancji, a nie jest dostępna z innej instancji tej samej klasy, ani z jej obiektu towarzyszącego. Analogicznie, jeśli definicja składowej obiektu poprzedzona jest takim modyfikatorem, to nie jest ona dostępna z klasy towarzyszącej.

Definicja klasy Hello1, z pliku PrivateThis1.scala, różni się od definicji tej klasy z pliku Private1.scala tym, że zamiast modyfikatora private, w definicji metody talk znajduje się modyfikator private[this].

Plik PrivateThis1.scala:
class Hello1(greeting: String) {
  private[this] def talk = println(greeting)
  def speak = talk
}

Dostęp do metody talk z metody speak nadal jest dozwolony, a z zewnątrz klasy nadal jest zabroniony.

scala> val hi = new Hello1("Hi")
hi: Hello1 = Hello1@6374ef

scala> hi.speak
Hi

scala> hi.talk
<console>:12: error: value talk is not a member of Hello1
       hi.talk
          ^

W pliku PrivateThis2.scala znajduje się próba podobnej modyfikacji przykładu z pliku Private2.scala. Definicja metody speak zawiera modyfikator private[this].

Plik PrivateThis2.scala:
class Hello2(greeting: String) {
  private[this] def speak = println(greeting)
  def dialog(other: Hello2) {
    this.speak
    other.speak 
  }
}

Kompilacja pliku kończy się błędem. Dostęp do metody speak w wierszu jest zabroniony, mimo że ta metoda jest zdefiniowana w tej samej klasie.

$ scalac PrivateThis2.scala
PrivateThis2.scala:5: error: value speak is not a member of Hello2
    other.speak
          ^
one error found

W pliku PrivateThis3.scala znajduje się próba modyfikacji definicji klasy Hello3, z pliku Private3.scala, przez zamianę modyfikatorów private na private[this].

Plik PrivateThis3.scala:
object Hello3 {
  private[this] def dialog(h1: Hello3, h2: Hello3) {
    h1.speak
    h2.speak
  }
}
class Hello3(greeting: String) {
  private[this] def speak = println(greeting)
  def talkTo(other: Hello3) = Hello3.dialog(this, other)
}

Również kompilacja pliku PrivateThis3.scala nie udaje się.

$ scalac PrivateThis3.scala
PrivateThis3.scala:3: error: value speak is not a member of Hello3
    h1.speak
       ^
PrivateThis3.scala:4: error: value speak is not a member of Hello3
    h2.speak
       ^
PrivateThis3.scala:9: error: value dialog is not a member of object Hello3
  def talkTo(other: Hello3) = Hello3.dialog(this, other)
                                     ^
three errors 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.