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

Dart/Flutter如何避免重复实例化firstName为'First'的StartValue类

解决方案

1. 改造StartValue类,用静态集合实现高效校验

我们可以借助静态Set来记录已使用的firstName——Set的查询时间复杂度为O(1),完全满足你无需遍历实例的高效需求。同时在构造函数中加入校验逻辑,直接阻止重复实例化指定值的对象:

class StartValue {
  final int id;
  final String firstName;
  final String lastName;
  
  // 静态集合,存储已被使用的firstName,查询效率极快
  static final Set<String> _usedFirstNames = {};

  // 构造函数内置校验逻辑
  StartValue({required this.id, required this.firstName, required this.lastName}) {
    // 针对"First"做单独校验:如果已存在则抛出错误
    if (firstName == 'First' && _usedFirstNames.contains('First')) {
      throw ArgumentError('firstName为"First"的StartValue仅能实例化一次');
    }
    // 将当前firstName存入集合(若只需限制"First",可改为仅存入该值)
    _usedFirstNames.add(firstName);
  }

  // 实现你需要的静态查询方法
  static bool contains(String firstName) {
    return _usedFirstNames.contains(firstName);
  }
}

2. 核心逻辑说明

  • 静态集合_usedFirstNames:专门记录已被实例化过的firstName,Set的contains方法无需遍历所有实例,直接通过哈希值定位,效率不受实例数量影响(哪怕有几千个实例也一样快)。
  • 构造函数校验:在创建对象时直接拦截重复的"First"实例,一旦检测到重复就抛出错误,从根源阻止非法实例化。
  • 静态contains方法:直接调用Set的查询能力,一行代码实现你需要的StartValue.contains("First")调用方式。

3. 使用示例

// 第一次实例化"First",正常创建
final validInstance = StartValue(id: 1, firstName: 'First', lastName: 'LastName');
print(StartValue.contains('First')); // 输出 true

// 尝试再次实例化"First",触发错误
try {
  final duplicateInstance = StartValue(id: 2, firstName: 'First', lastName: 'Test');
} catch (e) {
  print(e); // 输出: ArgumentError: firstName为"First"的StartValue仅能实例化一次
}

4. 针对性优化(可选)

如果你只需要限制firstName为"First"的情况,其他值允许重复,可以调整构造函数逻辑,仅把"First"存入集合,进一步节省内存:

StartValue({required this.id, required this.firstName, required this.lastName}) {
  if (firstName == 'First') {
    if (_usedFirstNames.contains('First')) {
      throw ArgumentError('firstName为"First"的StartValue仅能实例化一次');
    }
    _usedFirstNames.add('First');
  }
  // 其他firstName不做限制,无需存入集合
}

内容的提问来源于stack exchange,提问作者Ricardo Pereira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:46:37