----- 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

Reply via email to