When we have decided to ban this.items = items in the compact constructor and ask our users to use an assignment instead, it has a stupid side effect to make the parameters inside the compact constructor not effectively final, so a lambda can not capture them.
So a code like this doesn't compile :( record Matrix(int[][] items) { Matrix { var copy = new int[items.length]; Arrays.setAll(copy, i -> items[i].clone()); items = copy; // items is not effectively final anymore } } Obviouly, introducing an intermediary local variable works, but it's not pretty record Matrix(int[][] items) { Matrix { var copy = new int[items.length]; var items2 = items; Arrays.setAll(copy, i -> items2[i].clone()); items = copy; } } I'm not sure what we should do here :( I kind a like the current rules of a compact constructor. Rémi