【发布时间】:2018-01-06 14:26:13
【问题描述】:
我刚刚阅读了有效的 Java 规则 39(防御性副本)。没有明确告知,每个数据事务都应该发生两次复制以遵循此规则。下面是我想到的示例代码。似乎有些多余。我理解正确吗?有没有更好的办法?
public class SomeClass {
private MyData myData;
SomeClass() {
myData = new MyData("1");
}
public MyData getData() {
return new MyData(myData); // 1st Copy of data
}
public static void main(String[] args) {
SomeClass someClass = new SomeClass();
OtherClass otherClass = new OtherClass(someClass.getData()); //Pass data which is invariant
}
}
class OtherClass {
MyData myData;
OtherClass(MyData data) {
myData = new MyData(data); // 2nd Copy of data
}
}
class MyData {
private String name;
public MyData(String name) { this.name = name; }
public MyData(MyData data) { this.name = data.name; }
public void setName(String name) { this.name = name; }
}
【问题讨论】:
-
更好的方法是通过使用不可变类来避免防御性副本。我很确定这本书会谈到这一点。
-
注意:并非所有类都有复制构造函数
标签: java effective-java defensive-programming