使用哪种策略?对象克隆或简单的地图

时间:2013-07-23 20:28:20

标签: java

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

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. 映射以形成对象名称的关联数组,属性原始 值并遍历它们以获取点的属性初始值 乙

1 个答案:

答案 0 :(得分:2)

避免克隆,因为它始终需要深度克隆

.clone()尤其是在List上几乎总会流泪,因为您必须deep clone列表中的所有对象,所有引用的对象,等等。

Deep Cloning表示您必须为对象图中的每个最后一个对象制作二进制副本。只需复制reference即可获得shallow copy,您将看到对referenced对象所做的任何更改。只想错过一处房产,你会发现这个错误。

解决方案

你应该做的是制作所有CustomObject个实例Immutable然后你不需要担心版本控制,它们永远不会改变,突变会涉及创建一个同样{{ {1}}和一个完全不同的对象。然后你永远不必担心版本。

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