Почему Project Valhalla не вводит изменяемые структуры?
Мне кажется, что примитивные классы могли бы вести себя более эффективно (при разумных размерах), если бы они не были неизменяемыми, как предлагается в настоящее время, а работали бы больше как структуры C.
Учитывая этот примитивный класс
primitive class Point implements Shape {
public long x;
public long y;
public Point(long x, long y) {
this.x = x;
this.y = y;
}
public boolean contains(Point p) {
return equals(p);
}
}
interface Shape {
boolean contains(Point p);
}
И массивPoint[] points = new Point[N];
Почему бы нам не сделать это?
points[0].x = 42; //lastore
points[1].x++; //laload, iinc, lastore
Point p = points[2]; //laload, laload
Shape s = p; //new Point.ref (boxing)
p.x++; //iinc
assert !s.contains(p);
Вместо этого это звучит так, как будто текущий дизайн предназначен для чтения всей точки, видоизмененной с использованиемwithfield
и записывается полностью, что кажется расточительным, особенно для больших типов. Или компиляторы обычно применяли бы здесь исключение копирования?
Обратите внимание, чтоPoint
здесь должно быть сведено, а не сведено, чтобы пользователь мог быть уверен, что не изменит общий экземпляр.
Может ли кто-нибудь еще прояснить причину неизменности примитивных типов?
@видеть