Bad iteraction between the compact constructor and parameters captured by a lambda
Remi Forax
forax at univ-mlv.fr
Sat Oct 24 20:45:15 UTC 2020
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
More information about the amber-spec-experts
mailing list