You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复制并修改Retrofit2.0解析JSON生成的POJO类对象

解决方案:避免修改原对象的副本创建方法

你遇到的问题本质是Java对象引用的特性:当你执行revisedLexicalEntry = lexicalEntries.get(x)时,并没有创建新的LexicalEntry对象,只是把原列表中对象的引用赋值给了新变量。这意味着你后续修改revisedLexicalEntry的属性,其实就是在修改原列表里的对象本身。

要实现“保留原对象,修改副本”的需求,你需要真正创建原对象的拷贝,以下是几种适配不同场景的实现方式:

1. 手动创建新对象并复制属性(适合简单类)

如果LexicalEntry类的属性很少,手动复制是最直接的方式:

private void createSubWords(List<LexicalEntry> lexicalEntries) {
    // 新建列表存储修改后的副本,避免影响原列表
    List<LexicalEntry> revisedEntries = new ArrayList<>();
    
    for (LexicalEntry original : lexicalEntries) {
        // 创建新的LexicalEntry实例
        LexicalEntry revisedLexicalEntry = new LexicalEntry();
        // 复制原对象的所有属性
        revisedLexicalEntry.lexicalCategory = original.lexicalCategory;
        // 若后续类新增属性,需同步在这里添加复制逻辑
        
        // 自定义修改副本的属性
        revisedLexicalEntry.lexicalCategory = "Something...";
        
        revisedEntries.add(revisedLexicalEntry);
    }
    
    // 后续业务逻辑使用revisedEntries即可,原lexicalEntries完全不受影响
}

2. 添加拷贝构造方法(优雅可控,适合属性较多的类)

给LexicalEntry类添加一个拷贝构造方法,把属性复制的逻辑封装在类内部,后续维护更方便:

class LexicalEntry {
    public String lexicalCategory;
    
    // 拷贝构造方法:接收原对象,复制所有属性
    public LexicalEntry(LexicalEntry original) {
        this.lexicalCategory = original.lexicalCategory;
        // 类新增属性时,只需在这里补充复制逻辑
    }
}

使用时只需调用拷贝构造方法创建副本:

private void createSubWords(List<LexicalEntry> lexicalEntries) {
    List<LexicalEntry> revisedEntries = new ArrayList<>();
    
    for (LexicalEntry original : lexicalEntries) {
        // 通过拷贝构造方法创建原对象的副本
        LexicalEntry revisedLexicalEntry = new LexicalEntry(original);
        // 修改副本属性
        revisedLexicalEntry.lexicalCategory = "Something...";
        
        revisedEntries.add(revisedLexicalEntry);
    }
}

3. 利用Gson实现深拷贝(适合复杂嵌套对象)

因为你已经在使用Retrofit+Gson,刚好可以借助Gson的序列化/反序列化能力实现深拷贝——这种方式无需手动维护复制逻辑,哪怕LexicalEntry有嵌套对象(比如后续扩展时添加复杂属性)也能完美适配:

private void createSubWords(List<LexicalEntry> lexicalEntries) {
    Gson gson = new Gson();
    List<LexicalEntry> revisedEntries = new ArrayList<>();
    
    for (LexicalEntry original : lexicalEntries) {
        // 序列化原对象为JSON字符串,再反序列化为全新的对象实例
        String entryJson = gson.toJson(original);
        LexicalEntry revisedLexicalEntry = gson.fromJson(entryJson, LexicalEntry.class);
        
        // 修改副本属性
        revisedLexicalEntry.lexicalCategory = "Something...";
        
        revisedEntries.add(revisedLexicalEntry);
    }
}

内容的提问来源于stack exchange,提问作者Shahood ul Hassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:51:00