如何在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.
相关产品推荐
相关产品推荐

