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