5.15. Klasy i składowe finalne

Definicję składowej klasy można poprzedzić modyfikatorem final. Takiej składowej nie można nadpisać w klasie podrzędnej.

scala> class A { final def a = 1 }
defined class A

scala> class B extends A { override def a = 2 }
<console>:11: error: overriding method a in class A of type => Int;
 method a cannot override final member
       class B extends A { override def a = 2 }
                                        ^

Definicja klasy również może być poprzedzona modyfikatorem final. Nie jest możliwe tworzenie podklas takiej klasy.

scala> final class C { def c = 1 }
defined class C

scala> class D extends C
<console>:11: error: illegal inheritance from final class C
       class D extends C
                       ^

Za pomocą modyfikatora final umieszczonego przed słowem kluczowym val można definiować stałe. W klasie FinalVal z pliku FinalVal.scala zdefiniowana jest wartość niezmienna b oraz stała c. Wartość b nie jest stałą.

Plik FinalVal.scala:
class FinalVal {
  println("1) b = " + b + ", c = " + c)
  val b = 1
  final val c = 1
  println("2) b = " + b + ", c = " + c)
}

Umieszczone w definicji klasy wywołania metody println pokazują różnicę w działaniu między wartością b i stałą c. Pierwsze wywołanie metody println znajduje się przed oboma definicjami. Wynik wywołania tej metody pokazuje, że w czasie jej wywołania wartość b nie została jeszcze zainicjalizowana wartością 1 i jej wartość jest jeszcze równa domyślnej wartości 0. Natomiast stała c posiada już w tym momencie wartość 1, mimo że jej definicja jest umieszczona w dalszej części klasy. Drugie wywołanie metody println jest umieszczone po obu definicjach i pokazuje wartość 1 w przypadku zarówno b jak i c.

scala> new FinalVal
1) b = 0, c = 1
2) b = 1, c = 1
res0: FinalVal = FinalVal@1f4878b

Zauważmy przy okazji, że kompilator ostrzega przed odwoływaniem się do niezainicjalizowanej wartości.

$ scalac FinalVal.scala
FinalVal.scala:2: warning: Reference to uninitialized value b
  println("1) b = " + b + ", c = " + c)
                      ^
one warning found

Specyfikacja języka Scala opisuje modyfikator final w punkcie 5.2.6.

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.