You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用增强型枚举存储计量单位并整合转换解析逻辑

将单位转换逻辑整合到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:43:18