----- Mail original ----- > De: "Brian Goetz" <brian.go...@oracle.com> > À: "Remi Forax" <fo...@univ-mlv.fr>, "amber-spec-experts" > <amber-spec-experts@openjdk.java.net> > Envoyé: Samedi 24 Octobre 2020 23:47:42 > Objet: Re: Bad iteraction between the compact constructor and parameters > captured by a lambda
> On 10/24/2020 4:45 PM, Remi Forax wrote: >> 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 >> } >> } > > But, is this any different than capturing any other constructor > parameter that you mutate in the body? Nope, but you don't have to re-assign the parameter is a plain old constructor, you can use this.parameter = parameter; In a compact constructor, if you do a defensive copy, you have too change the value of the parameter. Rémi