I just started to explore the language Kotlin. I\'m struggling with inheritance, var&val and side-effects.
If I declare a trait A with a val x
You can make your val final, i.e. forbid overriding it at all.
If you define a val in a class, it is final by default.
Also, if you need to override a val with a var, but do not want the setter to be public, you can say so:
override var x = 1
private set
Overriding a val with a var is a feature. It is equivalent to adding a set-method while in the superclass there was only a get-method. And this is rather important in implementing some patterns, such as read-only interfaces.
There's no way to "protect" your val from being overridden in a way that allows changing mutation other than making it final, because val does not mean "immutable reference", but merely "read-only property". In other words, when your trait A declares a val, it means that through a reference of type A the client can not write this val, no other guarantees intended, or indeed possible.
P.S. Semicolons are optional in Kotlin, feel free to omit them altogether