举例:
public class Location {
private double x;
private double y;
public Location(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public void setXY(double x, double y) {
this.x = x;
this.y = y;
}
}
问题:setXY方法不是一个线程安全的方法。
实现:一个不可变类,如果Location发生变化,通过替换整个Location来避免线程安全问题。
// 这里的final使得Location不可被继承,因此子类无法改变它的行为
public final class Location {
private final double x;
private final double y;
public Location(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
}
Tip: 如果类中存在数据组或集合,在提供给外部访问之前需要做防御性复制。
public List<Integer> getData() {
return Collections.unmodifiableList(new ArrayList<>(data));
}