【发布时间】:2016-03-04 12:00:00
【问题描述】:
最近在 Java 开发人员角色的面试中,有人问我如何使 Class A 不可变,如果它有一个成员变量,它是 Class B 的对象,并且在 Class B 是项目外部并且不能由程序员编辑,而且类 B 甚至可能有一个自己的成员变量,它是另一个用户定义类的对象。我想了很多,并告诉面试官,除非 B 类已经实现并暴露了一个方法来深度克隆自己,否则没有办法。
但面试官并不相信。真的有办法让这样的类不可变吗?
如果我没记错的话,这就是他解释的情况。他想让我让 A 类不可变,最好的答案是什么?
final public class A {
final private B b;
A(B b) {
this.b = b; // Class b might/might not be cloneable
// this.b = (B)b.clone();
}
public B getB() {
return b;
// return (B)b.clone();
}
}
class B // external cannot edit
{
C c;
public C getC() {
return c;
}
public void setC(C c) {
this.c = c;
}
}
class C // external cannot edit
{
int i;
String j;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public String getJ() {
return j;
}
public void setJ(String j) {
this.j = j;
}
}
【问题讨论】:
-
不要为它写getter,写委托给不修改B状态的方法?
-
你必须在你设置或获取它的每个地方自己进行深度复制。
标签: java immutability deep-copy defensive-copy