我有一个 SBContainer
类,它有一个 StringBuffer
成员 mySB
。我正在像这样为 SBContainer
实现 Cloneable
-
SBContainer implements Cloneable {
public StringBuffer mySB;
public SBContainer() {
mySB = new StringBuffer("This is a test string");
}
public Object clone() throws CloneNotSupportedException {
SBContainer cloned = (SBContainer)super.clone();
return cloned;
}
}
现在,我为 MyContainer
创建了一个对象 sbc1
,它是 sbc2
的克隆对象。看起来容器 mySB
没有被克隆; sbc1.mySB
和 sbc2.mySB
指向相同的 StringBuffer
对象。我使用以下类进行了测试-
public class SBContainerTest {
public static void main(String[] args) {
SBContainer sbc1 = new SBContainer();
SBContainer sbc2 = null;
try {
sbc2 = (SBContainer)sbc1.clone();
} catch(CloneNotSupportedException e) {
e.printStackTrace();
}
sbc1.mySB.append(" ...something appended");
System.out.println(sbc2.mySB);
}
}
编辑:
输出是:This is a test string ...something appended
所以,我尝试像这样克隆 mySB
-
cloned.mySB = (StringBuffer)mySB.clone();
...我得到了这个错误-
SBContainerTest.java:8: clone() has protected access in java.lang.Object
cloned.mySB = (StringBuffer)mySB.clone();
^
1 error
那么,我该如何实现呢?如何克隆实现 Cloneable
的类的可变成员?
谢谢。
最佳答案
StringBuffer
不是Cloneable
,因此您必须手动克隆它。我在您的 clone
方法中建议这样的事情:
public Object clone() throws CloneNotSupportedException {
SBContainer cloned = (SBContainer)super.clone();
cloned.mySB = new StringBuffer(this.mySB);
return cloned;
}
关于java - 克隆可变成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6441217/