5.4. Zmienne i wartości publiczne

Zmienne i wartości definiowane za pomocą słów kluczowych var i val niepoprzedzonych innymi modyfikatorami stają się publiczne, a więc dostępne bez dodatkowych ograniczeń. Zdefiniowanie w klasie zmiennej publicznej przy pomocy słowa kluczowego var implikuje istnienie w niej następujących dwóch metod. Pierwsza ma nazwę taką, jak zmienna, nie ma parametrów i pozwala odczytywać wartość tej zmiennej. Druga ma nazwę taką, jak zmienna, uzupełnioną o znaki _= i ma jeden parametr o typie takim, jak typ definiowanej zmiennej. Ta druga metoda służy do ustawiania wartości zmiennej. Operacja przypisania wartości do zmiennej jest tłumaczona na wywołanie tej drugiej metody.

Jest błędem zdefiniowanie zmiennej (jak również wartości niezmiennej), której nazwa kończy się znakami _=.

scala> var a_= = 9
<console>:10: error: Names of vals or vars may not end in `_='
       var a_= = 9
           ^

Zdefiniowanie publicznej wartości niezmiennej przy pomocy słowa kluczowego val implikuje istnienie w klasie pierwszej z opisanych wyżej metod, czyli metody, która ma nazwę taką, jak zdefiniowana wartość, nie ma parametrów i pozwala na odczyt tej wartości. Definiując klasę możemy samodzielnie utworzyć metody o sygnaturach takich, jak opisane. Przykłady takich metod znajdują się w definicji klasy Hello, która znajduje się w pliku PublicValVar.scala.

Plik PublicValVar.scala:
class Hello {
  val hello = "Hello"
  var name = "John"
  def hello2 = { println("reading hello"); hello }
  def name2 = { println("reading name"); name }
  def name2_=(n: String) { println("setting name"); name = n }
}

Metody hello2, name2 i name2_= udostępniają alternatywne sposoby odczytu i ustawiania wartości hello i zmiennej name. Dodatkowo, z powodu użycia metody println, te metody powodują wypisanie na ekranie komunikatów.

scala> val a = new Hello
a: Hello = Hello@19ed6da

scala> a.hello
res0: String = Hello

scala> a.hello2
reading hello
res1: String = Hello
scala> a.name2 = "Peter"
setting name
reading name
a.name2: String = Peter

scala> a.name
res2: String = Peter

scala> a.name_=("Paul")

scala> a.name2
reading name
res4: String = Paul

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.