0

我需要帮助。我的代码是以下模板。假设 customObject 有多个 property1、property2、..property100。

List<CustomObject> customObjectList = /*<method call to external API that returns the said list >*/
if(customObjectList != null && customObjectList.size() > 0){
    //*** point A ***<clone the Object>
    resultList = <some method that process the above list>(customObjectList)

    if(resultList.size() > 0){
        for(Iterator<Map.Entry<CustomObject, ExternalResponse>> itr = resultList.entrySet().iterator(); itr.hasNext();) {
            //code that modifies the properties in the CustomObjects
            //*** point B ***resetAProperty(<Object clone>)
        }
    }
}

在 B 点,我需要在方法中使用原始对象的一个​​未修改的特定属性。为此,我有两种策略:

  1. 在 A 点克隆对象,并使用克隆的副本获取属性,如上代码所示。在 A 点,使用一个 for 循环和一个
  2. 映射形成对象名称、属性原始值的关联数组并遍历它们以获得B点的属性初始值
4

1 回答 1

2

避免克隆,因为它总是需要深度克隆

.clone()尤其是在 a 上List,几乎总是以泪水告终,因为您必须对deep clone列表中的所有对象、所有它们引用的对象等等进行处理。

Deep Cloning意味着您必须为对象图中的每个最后一个对象制作二进制副本。只需复制 a即可reference得到 a shallow copy,您将看到对该referenced对象所做的任何更改。只是错过一个属性,你将有一个地狱般的时间来找到那个错误。

解决方案

您应该做的是创建所有CustomObject实例Immutable,然后您无需担心版本控制,它们永远不会改变,突变将涉及创建一个新实例,该实例也是Immutable一个完全不同的对象。然后你就不必担心版本了。

当然,所有指向其他对象的实例变量也需要Immutable如此。这是同一个问题,deep clone但从另一个角度来看。一个更易于管理的角度。

于 2013-07-23T20:53:13.233 回答