Bad iteraction between the compact constructor and parameters captured by a lambda

Brian Goetz brian.goetz at
Sat Oct 24 21:47:42 UTC 2020

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?

More information about the amber-spec-experts mailing list