高级内存

引用类型 值类型化

引用类型的潜在风险

Driver.java

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
public class Driver { ... public static void main(String[] args) { Point point = new Point(1, 2); Rect rect1 = new Rect(); rect1.setPoint(point); rect1.setWidth(3); rect1.setHeight(6); point.setX(3); Rect rect2 = new Rect(); rect2.setPoint(point); rect2.setWidth(3); rect2.setHeight(6); } ...}

使用一般方法拷贝对象

Point.java

1 2 3 4 5
public class Point { public Point copy() { return new Point(x, y); }}

Driver.java

1 2 3 4 5 6 7 8 9 10 11*12 13 14*15 16 17 18 19
public class Driver { ... public static void main(String[] args) { Point point = new Point(1, 2); Rect rect1 = new Rect(); rect1.setPoint(point); rect1.setWidth(3); rect1.setHeight(6); Point p2 = point.copy(); Rect rect2 = new Rect(); rect2.setPoint(p2); rect2.setWidth(3); rect2.setHeight(6); } ...}

使用拷贝构造拷贝对象

Point.java

1 2 3 4 5 6
public class Point { public Point(Point point) { x = point.x; y = point.y; }}

Driver.java

1 2 3 4 5 6 7 8 9 10 11*12 13 14*15 16 17 18 19
public class Driver { ... public static void main(String[] args) { Point point = new Point(1, 2); Rect rect1 = new Rect(); rect1.setPoint(point); rect1.setWidth(3); rect1.setHeight(6); Point p2 = new Point(point); Rect rect2 = new Rect(); rect2.setPoint(p2); rect2.setWidth(3); rect2.setHeight(6); } ...}

使用不变对象机制

只有构造方法会给属性赋值

不提供任何方法修改属性

任何看似修改对象属性的方法,均会创建一个新的对象,并返回

Point.java

1 2 3 4 5
public class Point { public Point translated(int dx, int dy) { return new Point(x + dx, y + dy); }}

Driver.java

1 2 3 4 5 6 7 8 9 10 11*12 13 14*15 16 17 18 19
public class Driver { ... public static void main(String[] args) { Point point = new Point(1, 2); Rect rect1 = new Rect(); rect1.setPoint(point); rect1.setWidth(3); rect1.setHeight(6); Point p2 = point.translated(1, 0); Rect rect2 = new Rect(); rect2.setPoint(p2); rect2.setWidth(3); rect2.setHeight(6); } ...}

ZZAX 微信公众

文档一更新,立刻告诉你