Java中如何利用用户输入字符串调用UnitConverter的转换方法?
解决Java UnitConverter字符串转枚举调用的问题
我明白你现在卡在哪了——你已经拿到了单位的字符串(比如"KILOGRAMS"),但UnitConverter.convert()方法需要的是枚举常量(比如UnitConverter.Mass.KILOGRAMS),而不是直接传字符串。下面给你两种可行的解决方案,适配你的代码逻辑:
方案一:利用编号区分单位类型,直接转对应枚举
因为你已经通过编号把单位分成了三类(1-2=质量,3-7=长度,8=数量),可以直接根据编号判断类型,再用枚举的valueOf()方法把字符串转成枚举常量:
// 你的原有代码... // 判断单位不同且属于同一类型则执行转换 if (!finalUnit.trim().equalsIgnoreCase(startUnit)) { if (startUnitNo < 3 && finalUnitNo < 3) { // 质量单位转换:KILOGRAMS/POUNDS UnitConverter.Mass startMass = UnitConverter.Mass.valueOf(startUnit); UnitConverter.Mass finalMass = UnitConverter.Mass.valueOf(finalUnit); double result = UnitConverter.convert(1.0, startMass, finalMass); System.out.println("转换结果:" + result); } else if ((startUnitNo >=3 && startUnitNo <=7) && (finalUnitNo >=3 && finalUnitNo <=7)) { // 长度单位转换:METERS/FEET/INCHES/CENTIMETERS/MILLIMETERS UnitConverter.Lengths startLength = UnitConverter.Lengths.valueOf(startUnit); UnitConverter.Lengths finalLength = UnitConverter.Lengths.valueOf(finalUnit); double result = UnitConverter.convert(1.0, startLength, finalLength); System.out.println("转换结果:" + result); } else if (startUnitNo ==8 && finalUnitNo ==8) { // 数量单位,无需转换 System.out.println("数量单位无需转换"); } else { System.out.println("无法跨类型转换(比如质量转长度)"); } }
注意事项:
- 确保
UnitConverter里的枚举名称和你HashMap存的字符串完全一致(比如UnitConverter.Mass里确实有KILOGRAMS和POUNDS常量)。 - 如果怕出现异常(比如字符串不匹配),可以加个
try-catch块包裹valueOf()调用。
方案二:建立字符串到枚举常量的全局映射
如果你不想依赖编号判断类型,可以提前把所有字符串和对应的枚举常量存在一个Map里,后续直接取值调用:
// 在类初始化或方法开头创建映射 Map<String, Enum<?>> unitToEnumMap = new HashMap<>(); // 填充质量单位 unitToEnumMap.put("KILOGRAMS", UnitConverter.Mass.KILOGRAMS); unitToEnumMap.put("POUNDS", UnitConverter.Mass.POUNDS); // 填充长度单位 unitToEnumMap.put("METERS", UnitConverter.Lengths.METERS); unitToEnumMap.put("FEET", UnitConverter.Lengths.FEET); unitToEnumMap.put("INCHES", UnitConverter.Lengths.INCHES); unitToEnumMap.put("CENTIMETERS", UnitConverter.Lengths.CENTIMETERS); unitToEnumMap.put("MILLIMETERS", UnitConverter.Lengths.MILLIMETERS); // 填充数量单位 unitToEnumMap.put("PIECE", UnitConverter.Quantity.PIECE); // 你的原有代码... // 判断单位不同则执行转换 if (!finalUnit.trim().equalsIgnoreCase(startUnit)) { Enum<?> startEnum = unitToEnumMap.get(startUnit); Enum<?> finalEnum = unitToEnumMap.get(finalUnit); // 判断两个枚举是否属于同一类型,再执行转换 if (startEnum instanceof UnitConverter.Mass && finalEnum instanceof UnitConverter.Mass) { double result = UnitConverter.convert(1.0, (UnitConverter.Mass) startEnum, (UnitConverter.Mass) finalEnum); System.out.println("转换结果:" + result); } else if (startEnum instanceof UnitConverter.Lengths && finalEnum instanceof UnitConverter.Lengths) { double result = UnitConverter.convert(1.0, (UnitConverter.Lengths) startEnum, (UnitConverter.Lengths) finalEnum); System.out.println("转换结果:" + result); } else if (startEnum instanceof UnitConverter.Quantity && finalEnum instanceof UnitConverter.Quantity) { System.out.println("数量单位无需转换"); } else { System.out.println("无法跨类型转换"); } }
这个方案更灵活,哪怕后续新增单位,只需要在Map里加新的映射即可,不用修改判断逻辑。
内容的提问来源于stack exchange,提问作者SWA
相关产品推荐
相关产品推荐

