我需要帮助。我的代码是以下模板。 假设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点,我需要在方法中使用原始对象的一个未修改的特定属性。我有两个策略:
答案 0 :(得分:2)
.clone()
尤其是在List
上几乎总会流泪,因为您必须deep clone
列表中的所有对象,所有引用的对象,等等。
Deep Cloning
表示您必须为对象图中的每个最后一个对象制作二进制副本。只需复制reference
即可获得shallow copy
,您将看到对referenced
对象所做的任何更改。只想错过一处房产,你会发现这个错误。
你应该做的是制作所有CustomObject
个实例Immutable
然后你不需要担心版本控制,它们永远不会改变,突变会涉及创建一个同样{{ {1}}和一个完全不同的对象。然后你永远不必担心版本。
当然,所有指向其他对象的实例变量也需要Immutable
。这与Immutable
的问题相同,但是从另一个角度来看。一个更易于管理的角度。