【问题标题】:Copying An Object With Sharing References To Member Data复制对象并共享对成员数据的引用
【发布时间】:2012-05-24 14:22:55
【问题描述】:

我有一个 Java webapp,它提取员工的记录并将其存储在一个自制的数据持有者对象中,奇怪的是称为“EmployeeRecordDataHolder”。

我想在更新过程开始时制作一份 EmployeeRecordDataHolder 的副本,以便进行比较以报告数据的变化情况。

我在成员数据的原始和副本共享引用中遇到了一些问题,结果是原始数据没有保持未更新状态。

我最初通过 HashMap 从数据库中取回数据。如果我从 HashMap get() 填充两个对象(原始对象和副本),这两个对象是否仍会共享对数据的相同引用,从而导致更改一个对象中的数据也会更改副本中的数据?

如果我使用 HashMap 填充原始对象,然后通过在副本的所有 setter 中调用原始对象上的所有 getter 来制作副本,该怎么办?示例:

copyDataHolderObj.setSomePieceOfData(  originalDataHolderObj.getSomePieceOfData() );

这种方法会导致两个可以相互独立更改的对象吗?

非常感谢

史蒂夫

【问题讨论】:

    标签: java clone deep-copy


    【解决方案1】:

    回答你的第一个问题:

    是的,两者都将共享对同一对象的引用。 HashMap 存储引用,因此所做的任何更新都是在原始对象上完成的。 This 页面清楚地解释了更改已反映。

    回答你的第二个问题:

    你可以这样做。创建所有对象的副本。

    【讨论】:

    • 所以做类似的事情:copyDataHolderObj.setSomePieceOfData( originalDataHolderObj.getSomePieceOfData() );所有数据值都会给我两个我可以更新的对象,彼此独立,而不影响另一个对象中的值?
    • 是的。假设您在 ClassName copyDataHolderObj = new ClassName(); 之前创建了一个新对象,其中 ClassName 是必需的类。
    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 2015-02-17
    • 2015-08-01
    • 2016-01-06
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 2012-11-07
    相关资源
    最近更新 更多