Oops, instead of var copy = new int[items.length]; it should be var copy = new int[items.length][];
I've fixed the codes below. ----- Mail original ----- > De: "Remi Forax" <fo...@univ-mlv.fr> > À: "amber-spec-experts" <amber-spec-experts@openjdk.java.net> > Envoyé: Samedi 24 Octobre 2020 22:45:15 > Objet: Bad iteraction between the compact constructor and parameters captured > by a lambda > 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