list.add(tclientSignContract) 添加多个同类型实例,结果所有实例内容都一样

2025-01-15T16:18:36

示例代码如下:

try {
    List<TclientSignContract> list = new ArrayList<>();
    // 合同1
    TclientSignContract tclientSignContract = new TclientSignContract();
    tclientSignContract.setFileName("征信授权书");
    QueryContractUrlDTO request2 = new QueryContractUrlDTO();
    request2.setOrderNumber(request.getOrderNumber());
    request2.setSignType("1");
    tclientSignContract.setUrl(getXSignUrl(request2));
    tclientSignContract.setZfStatus("0"); // 无法获取其签署状态,默认未签署
    list.add(tclientSignContract);
    // 合同2
    request.setContractType("1");
    SaveContractInfoDTO result = JSONObject.parseObject(xService.queryContractStatus(request), SaveContractInfoDTO.class);
    tclientSignContract.setFileName("租赁主合同");
    tclientSignContract.setUrl(result.getContractDetail().get(0).getSignURL());
    tclientSignContract.setZfStatus(StringUtils.equals(result.getContractSignStatus(), "00") ? "1" : "0");
    list.add(tclientSignContract);
    // 合同3
    request.setContractType("3");
    SaveContractInfoDTO result2 = JSONObject.parseObject(xService.queryContractStatus(request), SaveContractInfoDTO.class);
    tclientSignContract.setFileName("抵押合同");
    tclientSignContract.setUrl(result2.getContractDetail().get(0).getSignURL());
    tclientSignContract.setZfStatus(StringUtils.equals(result2.getContractSignStatus(), "00") ? "1" : "0");
    list.add(tclientSignContract);
} catch (Exception e) {
    log.error("获取合同签署状态异常!", e);
}
log.info("查询资方合同列表:{}", JSON.toJSONString(list));
return list;

写一个合同列表接口,根据需求,分别调用接口获取合同的链接和签署状态,并将其实例添加到列表中返回。

没想到,结果返回的实例内容完全一样。

一开始怀疑是 try - catch 导致的,去掉会抛异常的查询没有用,再去除 try - catch 也没用,内容依然一致。

使用通义灵码描述了一下这个问题,反馈:

对象引用问题:如果 tclientSignContract 是一个可变对象,并且你在循环或其他地方重复使用同一个对象实例进行修改,那么实际上你只是在不断添加同一个对象的引用。因此,任何对这个对象的修改都会反映在所有引用上。

深拷贝/浅拷贝问题:如果你需要添加多个不同的实例,但每次都基于同一个初始对象创建新实例,确保你进行了深拷贝而不是浅拷贝。否则,所有实例仍然会指向相同的内部状态。

解决方案:

解决方案
确保每次插入的是不同的对象实例: 如果你需要插入多个不同的实例,请确保每次插入的是一个新的对象实例,而不是重复使用同一个对象。
使用深拷贝: 如果你需要基于现有对象创建新的实例,可以考虑使用深拷贝来确保每个实例是独立的。

示例代码:

 创建一个新的实例并复制内容
TClientSignContract newTClientSignContract = new TClientSignContract();
BeanUtils.copyProperties(tclientSignContract, newTClientSignContract);
// 将新实例添加到列表中
list.add(newTClientSignContract);

// 或者使用克隆方法

// 使用克隆方法创建新实例
TClientSignContract newTClientSignContract = tclientSignContract.clone();
// 将新实例添加到列表中
list.add(newTClientSignContract);

对照解释,应该属于对象引用问题,因为是多次使用同一个对象实例进行修改。先尝试使用 clone() 方法复制一个实例出来再添加,比较简洁。结果该实例所属类没有实现 Cloneable 接口,无法使用克隆方法。而 BeanUtils.copyProperties 方法还是需要额外创建一个新的实例,所以干脆直接针对每次插入都创建新的实例就好了。

最终版本:

try {
    List<TclientSignContract> list = new ArrayList<>();
    // 合同1
    TclientSignContract tclientSignContract = new TclientSignContract();
    tclientSignContract.setFileName("征信授权书");
    QueryContractUrlDTO request2 = new QueryContractUrlDTO();
    request2.setOrderNumber(request.getOrderNumber());
    request2.setSignType("1");
    tclientSignContract.setUrl(getXSignUrl(request2));
    tclientSignContract.setZfStatus("0"); // 无法获取其签署状态,默认未签署
    list.add(tclientSignContract);
    // 合同2
    request.setContractType("1");
    SaveContractInfoDTO result = JSONObject.parseObject(xService.queryContractStatus(request), SaveContractInfoDTO.class);
        tclientSignContract = new TclientSignContract();
    tclientSignContract.setFileName("租赁主合同");
    tclientSignContract.setUrl(result.getContractDetail().get(0).getSignURL());
    tclientSignContract.setZfStatus(StringUtils.equals(result.getContractSignStatus(), "00") ? "1" : "0");
    list.add(tclientSignContract);
    // 合同3
    request.setContractType("3");
    SaveContractInfoDTO result2 = JSONObject.parseObject(xService.queryContractStatus(request), SaveContractInfoDTO.class);
        tclientSignContract = new TclientSignContract();
    tclientSignContract.setFileName("抵押合同");
    tclientSignContract.setUrl(result2.getContractDetail().get(0).getSignURL());
    tclientSignContract.setZfStatus(StringUtils.equals(result2.getContractSignStatus(), "00") ? "1" : "0");
    list.add(tclientSignContract);
} catch (Exception e) {
    log.error("获取合同签署状态异常!", e);
}
log.info("查询资方合同列表:{}", JSON.toJSONString(list));
return list;
当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »