多版本Hafas模型转换场景下如何避免代码重复?
多版本Hafas模型转换器优化方案
方案1:泛型+抽象类抽离公共逻辑(改造成本最低,推荐)
将完全一致的转换逻辑抽到抽象泛型父类中,把不同版本的POJO类作为泛型参数,仅把少数有差异的逻辑定义为抽象方法,由各版本的转换器子类实现即可,95%以上的公共代码不需要重复编写。
代码示例:
// 通用抽象转换器,泛型T为对应版本Leg类,L为对应版本LegList类 public abstract class AbstractHafasConverter<T, L> { // 完全公共的逻辑直接在父类实现,所有版本复用 public void convertHafasLegsInsideCustomTrip(TripStructure myTrip, L hafasLegs) { for (T hafasLeg : getLegList(hafasLegs)) { // We have to convert each Hafas Leg to Trias TripLegStructure TripLegStructure myTripLeg= convertToTriasTripLeg(hafasLeg); if (myTripLeg!= null) myTrip.getTripLeg().add(myTripLeg); else throw new NullPointerException("ERROR: HAFAS TripResult conversion ended up with NULL object"); } } // 差异部分抽为抽象方法,由各版本子类实现 protected abstract List<T> getLegList(L legList); protected abstract TripLegStructure convertToTriasTripLeg(T hafasLeg); }
1.23版本转换器仅需实现差异逻辑:
import com.hafas.v123.Leg; import com.hafas.v123.LegList; // 1.23版本转换器继承抽象父类,传入对应版本的POJO类作为泛型参数 public class HafasConverterV123 extends AbstractHafasConverter<Leg, LegList> { @Override protected List<Leg> getLegList(LegList legList) { return legList.getLeg(); } @Override protected TripLegStructure convertToTriasTripLeg(Leg hafasLeg) { // 仅实现1.23版本Leg转TripLeg的逻辑即可 } }
1.29版本转换器同理,仅需替换导入的POJO包路径,实现少量差异方法:
import com.hafas.v129.Leg; import com.hafas.v129.LegList; public class HafasConverterV129 extends AbstractHafasConverter<Leg, LegList> { @Override protected List<Leg> getLegList(LegList legList) { return legList.getLeg(); } @Override protected TripLegStructure convertToTriasTripLeg(Leg hafasLeg) { // 仅实现1.29版本Leg转TripLeg的逻辑即可 } }
方案2:适配器模式统一POJO访问接口(适合后续版本差异变大的场景)
为不同版本的POJO定义统一的访问接口,比如HafasLeg、HafasLegList接口,每个版本写对应的适配器类实现该接口,包装对应版本的POJO实例,上层转换逻辑完全依赖统一接口,不需要感知具体版本,连泛型都不需要使用。
方案3:JAXB生成POJO时绑定公共接口(如果POJO是JAXB从XML Schema生成的场景最优)
使用JAXB的inheritance插件,在自动生成不同版本POJO的时候,直接让同名类实现同一个公共接口,上层转换逻辑直接依赖公共接口开发,完全不需要区分版本。
优化收益
- 原有50个相似度97%的方法仅需保留1份公共实现,代码冗余率降低95%以上
- 后续新增版本时仅需实现不到5%的差异逻辑,开发效率大幅提升
- 公共逻辑迭代只需修改抽象父类一处,所有版本同步生效,避免多份重复代码改漏的运维问题
内容的提问来源于stack exchange,提问作者Chuck Nuris
相关产品推荐
相关产品推荐

