Meaning of "shallowly immutable" in the documentation of Record in Java 14
java, java-14, java-record
Solution
Shallowly immutable means, that if a class has fields, these fields are treated as being `final`. However, their fields (i.e. the fields of the fields) don't need to be `final`.
You don't need to implement a constructor, it's already implemented this way for you. But if you choose to implement it yourself, e.g. for argument validation, then this invariant should hold.
Problem
I am reading the documentation of Records and don't understand the term "shallowly immutable". What do we mean by shallowly immutable? And if it's immutable why we need a copy constructor? Why two "Hello Worlds!"? For all record classes, the following invariant must hold: if a record R's components are c1, c2, ... cn, then if a record instance is copied as follows: ``` R copy = new R(r.c1(), r.c2(), ..., r.cn()); // copy constructor ? ``` then it must be the case that `r.equals(copy)`.