In Scala, difference between final val and val [duplicate]
Solution 1:
final
members cannot be overridden, say, in a sub-class or trait.
Legal:
class A {
val a = 1
}
class B extends A {
override val a = 2
}
Illegal:
class A {
final val a = 1
}
class B extends A {
override val a = 2
}
You'll get an error such as this:
:9: error: overriding value a in class A of type Int(1);
value a cannot override final member
Solution 2:
In Scala, final
declares that a member may not be overridden in subclasses. For example:
class Parent {
val a = 1
final val b = 2
}
class Subclass extends Parent {
override val a = 3 // this line will compile
override val b = 4 // this line will not compile
}
Also, as discussed in Why are `private val` and `private final val` different?, if a final val
field is holding a "constant value", a constant primitive type, access to it will be replaced with the bytecode to load that value directly.