Kotlin中如何实现跨仓库枚举类型的转换?
解决同值枚举类(PilotType ↔ PilotTypeDto)的转换问题
下面提供几种实用的转换方案,根据你的枚举结构选择即可:
方案1:通过枚举名称匹配(推荐,前提是枚举项名称完全一致)
利用枚举的name()方法获取Dto枚举的项名称,再用主枚举的valueOf()方法生成对应实例:
public static PilotType convertPilotTypeDtoToPilotType(PilotTypeDto pilotTypeDto) { if (pilotTypeDto == null) { return null; } return PilotType.valueOf(pilotTypeDto.name()); }
注意:此方法要求两个枚举的枚举项名称完全相同(大小写敏感),如果后续枚举项名称有修改,需要同步维护两边的一致性。
方案2:通过枚举序号匹配(不推荐,风险高)
如果枚举项的顺序完全一致且永远不会变动,可以通过ordinal()索引转换:
public static PilotType convertPilotTypeDtoToPilotType(PilotTypeDto pilotTypeDto) { if (pilotTypeDto == null) { return null; } return PilotType.values()[pilotTypeDto.ordinal()]; }
⚠️ 风险提示:只要任意一方枚举调整了项的顺序、新增或删除枚举项,转换结果就会出错,仅适合枚举结构完全固定的极端场景。
方案3:通过业务编码匹配(最安全,适合带编码字段的枚举)
如果两个枚举都定义了对应的业务编码(比如code字段和getCode()方法),可以通过编码值匹配:
public static PilotType convertPilotTypeDtoToPilotType(PilotTypeDto pilotTypeDto) { if (pilotTypeDto == null) { return null; } for (PilotType type : PilotType.values()) { if (type.getCode().equals(pilotTypeDto.getCode())) { return type; } } throw new IllegalArgumentException("无法识别的PilotTypeDto枚举值: " + pilotTypeDto); }
这种方式不受枚举名称、顺序变化的影响,只要业务编码一致就能正确转换,是扩展性最强的方案。
内容的提问来源于stack exchange,提问作者Dave Whyte
相关产品推荐
相关产品推荐

