final
и неизменность два ортогональных понятия:
val
означает, что вы не можете изменить (мутировать) переменную, присвоив ничего к нему после первоначального объявления:
val x = 1
x = 2 // error: reassignment to val
В JVM байткод это осуществляется создание частного члена и добытчика, но не сеттер:
class A {
val x = 1
}
=>
// Java equivalent of a generated bytecode
public class A {
private final int x;
public int x() { return x; }
...
}
final
означает, что вы можете» т переопределить val
в подклассе:
class A {
final val x = 1
}
class B extends A {
override val x = 2
}
// error: overriding value x in class A of type Int(1);
// value x cannot override final member
final
вызовет ту же ошибку, если вы используете var
вместо val
.
Пожалуйста, смотрите [this] (http://stackoverflow.com/a/13428362/1263942) о том, почему 'val' не 'final': они могут быть переопределены –