java - 克隆可变成员

标签 java clone

我有一个 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.mySBsbc2.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/

相关文章:

java - 创建原型(prototype)的副本,我应该使用克隆吗?

java - 有什么关于加速克隆 HashMap 的 Java 代码的建议吗?

svn - 使用 Git-Svn 克隆一个非标准的 Svn 存储库

JavaFX - css 在我的元素中不起作用

java - 使用 ibm watson 文本到语音服务处理多个查询

java - 在单个程序中制作多个帧

java - 升级到jetty-9.3.3后JSP编译报错

actionscript-3 - AS3 - 如何复制 Sprite / Sprite 图形?

javascript - 如果元素在 <form> 中,为什么 clone() 太慢?

c# - 构建器模式实现 C# vs. JAVA