如何为含orden属性的不同类型对象创建通用代码
问题描述
我有一个实体,其包含多个不同类的对象列表作为子元素,这些对象虽类不同,但都拥有orden属性。我在多处编写了重复代码,例如需要按该属性对列表排序时,因类型不同无法简化。
实体结构如下:
contenido={ "educaciones":[ { ... "orden":0 },{ ... "orden":1 } ], "experiencias":[ { ... "orden":0 },{ ... "orden":1 } ] }, ...
当前重复代码示例:
if(tipo.equals("experiencias")){ List<Experiencia> iterable=contenido.getExperiencias(); for(int i = 0; i < iterable.size(); i++){ iterable.get(i).setOrden( orden.get(i) ); //orden = [0,3,5,...] } iterable.sort((it1,it2)-> it1.getOrden().compareTo(it2.getOrden())); }else if(tipo.equals("educaciones")){ List<Educacion> iterable=contenido.getEducaciones(); for(int i = 0; i < iterable.size(); i++){ iterable.get(i).setOrden( orden.get(i) ); } iterable.sort((it1,it2)-> it1.getOrden().compareTo(it2.getOrden())); }else if...
请问是否有办法创建支持不同对象的更通用代码?
解决方案
可以通过面向接口编程彻底消除重复代码,具体步骤如下:
1. 定义统一接口
创建包含orden属性操作方法的接口,让所有拥有该属性的类实现此接口:
public interface Ordenable { Integer getOrden(); void setOrden(Integer orden); }
让Experiencia、Educacion等类实现该接口:
public class Experiencia implements Ordenable { private Integer orden; @Override public Integer getOrden() { return orden; } @Override public void setOrden(Integer orden) { this.orden = orden; } // 类原有其他属性和方法 } public class Educacion implements Ordenable { private Integer orden; @Override public Integer getOrden() { return orden; } @Override public void setOrden(Integer orden) { this.orden = orden; } // 类原有其他属性和方法 }
2. 编写通用处理方法
将重复的赋值、排序逻辑抽成通用方法,参数使用接口类型:
private void processOrdenableList(List<? extends Ordenable> list, List<Integer> ordenList) { // 批量设置orden值 for (int i = 0; i < list.size(); i++) { list.get(i).setOrden(ordenList.get(i)); } // 按orden属性排序 list.sort(Comparator.comparing(Ordenable::getOrden)); }
3. 简化类型判断逻辑
用映射表替代冗长的if-else,快速根据类型获取对应列表:
// 初始化类型与列表的映射关系 Map<String, List<? extends Ordenable>> tipoToListMap = new HashMap<>(); tipoToListMap.put("experiencias", contenido.getExperiencias()); tipoToListMap.put("educaciones", contenido.getEducaciones()); // 后续新增类型直接在此添加映射即可 // 调用通用方法处理 List<? extends Ordenable> targetList = tipoToListMap.get(tipo); if (targetList != null) { processOrdenableList(targetList, orden); }
后续新增拥有orden属性的类时,只需让类实现Ordenable接口,并在映射表中添加对应关系,无需修改核心处理逻辑,彻底解决代码重复问题。
内容的提问来源于stack exchange,提问作者Maxi
相关产品推荐
相关产品推荐

