如何用增强型枚举存储计量单位并整合转换解析逻辑
将单位转换逻辑整合到Dart枚举中的最优方案
完全可以把单位转换逻辑整合到枚举里,这种方式比零散的工具函数更优雅,也更符合面向对象的封装原则——单位的转换规则本身就属于单位概念的一部分。
改造后的枚举(内置转换逻辑)
我们可以给每个枚举值绑定一个「转换为基准单位(米)」的系数,再通过基准单位中转实现任意单位间的转换,避免写大量两两转换的冗余代码:
enum UnitsOfMeasurement { meters(1.0), feet(0.3048), inches(0.0254), centimeters(0.01), millimeters(0.001); // 当前单位转换为米的系数 final double toMeters; const UnitsOfMeasurement(this.toMeters); // 将当前单位的数值转换为目标单位的数值 double convertTo(double value, UnitsOfMeasurement targetUnit) { // 先转成基准单位(米),再转成目标单位 final double valueInMeters = value * toMeters; return valueInMeters / targetUnit.toMeters; } }
优化MyMaterial类(添加便捷转换方法)
为了更方便使用,可以给MyMaterial类添加一个转换单位的方法,直接返回新的实例:
class MyMaterial { final double height; final UnitsOfMeasurement unitOfMeasurement; MyMaterial({required this.height, required this.unitOfMeasurement}); // 转换单位并返回新的MyMaterial实例 MyMaterial convertUnit(UnitsOfMeasurement newUnit) { final double newHeight = unitOfMeasurement.convertTo(height, newUnit); return MyMaterial(height: newHeight, unitOfMeasurement: newUnit); } }
使用示例
void main() { // 创建一个1米的材料实例 final material = MyMaterial(height: 1.0, unitOfMeasurement: UnitsOfMeasurement.meters); // 转换为英尺 final materialInFeet = material.convertUnit(UnitsOfMeasurement.feet); print('1米 = ${materialInFeet.height.toStringAsFixed(2)}英尺'); // 输出:1米 = 3.28英尺 // 转换为毫米 final materialInMm = material.convertUnit(UnitsOfMeasurement.millimeters); print('1米 = ${materialInMm.height}毫米'); // 输出:1米 = 1000.0毫米 }
方案优势
- 逻辑集中:所有单位转换逻辑都封装在枚举内部,避免零散工具函数的维护问题
- 扩展性强:新增单位时,只需给枚举添加新值并传入对应的转米系数,无需修改转换方法
- 可读性高:调用时通过枚举或实例方法操作,语义清晰,代码更易理解
内容的提问来源于stack exchange,提问作者Preston Schwartz
相关产品推荐
相关产品推荐

