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. |