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