如何复制并修改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
相关产品推荐
相关产品推荐

