Constructor val properties are actually mutable, since they can be mutated using a copy() function to get a new value. But this constructor/non-constructor is a wrong dichotomy: Constructor properties must be backed by a field. While this is a good default, there is no intrinsic relation ...