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

Reply via email to