I know that a val is not final unless explicitly declared so and using javap confirms that Scalac is not inserting finalinto the bytecode.
So is a val immutable simply because the compiler stops us from writing any code that attempts to mutate it?
final and immutability are two orthogonal concepts:
val means you can't change (mutate) a variable by assigning anything to it after initial declaration:
val x = 1
x = 2 // error: reassignment to val
In JVM bytecode it's implemented by creating a private member and a getter, but not setter:
class A {
val x = 1
}
=>
// Java equivalent of a generated bytecode
public class A {
private final int x;
public int x() { return x; }
...
}
final means you can't override your val in a subclass:
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 will cause the same error if you use var instead of val.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With