高级内存
引用类型 值类型化
引用类型的潜在风险
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); } ...}