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

如何在Dart的const类中处理惰性方法?

Dart const不可变类的昂贵方法缓存方案

因为const类的所有字段必须是编译时常量,没法用普通可空字段存储缓存结果,给你几个简便的解决思路:

  • 静态Map缓存+属性/哈希键
    利用const实例的不可变性——相同参数的const实例是同一个对象,属性值和哈希码固定不变。可以用静态Map存储计算结果,键直接用类的关键属性(更直观)或者实例哈希码,首次调用时计算并存入缓存,后续直接读取:

    class ImmutableMath {
      final int baseNumber;
    
      const ImmutableMath(this.baseNumber);
    
      static final Map<int, int> _calcCache = {};
    
      int get largeCalculation {
        // 用baseNumber当键,适合属性唯一标识实例的场景
        return _calcCache.putIfAbsent(baseNumber, () {
          // 模拟耗时计算:比如大数迭代运算
          int result = 1;
          for (var i = 0; i < 100000; i++) {
            result *= baseNumber;
          }
          return result;
        });
      }
    }
    

    这个方案无需额外依赖,代码简洁,且因const实例属性不会变更,缓存结果永远有效。

  • 提取静态计算方法+缓存
    如果昂贵计算仅依赖类的单个属性,可直接把计算逻辑抽成静态方法,用属性值作为缓存键,getter里直接调用静态方法即可,逻辑更清晰:

    class ImmutableConfig {
      final String configKey;
    
      const ImmutableConfig(this.configKey);
    
      static final Map<String, String> _parseCache = {};
    
      String get parsedConfig {
        return _parseConfig(configKey);
      }
    
      static String _parseConfig(String key) {
        return _parseCache.putIfAbsent(key, () {
          // 模拟解析复杂配置的昂贵操作
          return key.split('').reversed.join().toUpperCase();
        });
      }
    }
    

如果你的实例数量极大且参数各不相同,担心静态Map占用过多内存,可以改用WeakMap做弱引用缓存,它会在实例被GC回收时自动移除对应缓存项:

static final WeakMap<ImmutableMath, int> _weakCache = WeakMap();

int get largeCalculation {
  if (_weakCache.containsKey(this)) {
    return _weakCache[this]!;
  }
  final result = // 计算逻辑
  _weakCache[this] = result;
  return result;
}

内容的提问来源于stack exchange,提问作者Chris B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 01:27:10