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
相关产品推荐
相关产品推荐

