一、 背景
最近在开发过程中遇到一个需求:
需要用原来的对象复制一个新的对象,接着在新的对象中修改属性,但原本对象的属性又不能被改变
二、代码实现
1. 首先这个类需要实现Cloneable接口并重写其中的clone方法
public class ParameterEventInfo implements Cloneable {
private String line;
private String workcell;
private String device;
private String deviceType;
private String deviceModel;
private Long timestamp;
private ParameterEventBody data;
@Override
public ParameterEventInfo clone() {
ParameterEventInfo parameterEventInfo = null;
try {
parameterEventInfo = (ParameterEventInfo) super.clone();
parameterEventInfo.data = data.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
return parameterEventInfo;
}
}
2. 类中的data属性是另一个对象,同理也需要实现相同的方法
public class ParameterEventBody implements Cloneable {
private String eventName;
private String eventType;
private Map<String, Object> data;
@Override
protected ParameterEventBody clone() {
ParameterEventBody parameterEventBody = null;
try {
parameterEventBody = (ParameterEventBody) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
return parameterEventBody;
}
}
3. 测试
@SpringBootTest
class ParameterEventInfoTest {
@Test
void testClone() {
// 原来的对象
ParameterEventInfo parameterEventInfo1 = new ParameterEventInfo();
ParameterEventBody parameterEventBody = new ParameterEventBody();
parameterEventBody.setEventType("testType");
parameterEventInfo1.setData(parameterEventBody);
// 深拷贝的对象
ParameterEventInfo parameterEventInfo2 = parameterEventInfo1.clone();
parameterEventInfo2.getData().setEventType("testType2");
// 输出对象hash结果,验证深拷贝是否成功
System.out.println("parameterEventInfo1 中 data 的 hash值" + parameterEventInfo1.getData().hashCode());
System.out.println("parameterEventInfo2 中 data 的 hash值" + parameterEventInfo2.getData().hashCode());
}
}
测试结果:
parameterEventInfo1 中 data 的 hash值1060420485
parameterEventInfo2 中 data 的 hash值-1497353533
测试成功