为什么在dart中重写某些字段时必须将类注解为不可变?

8ehkhllq  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(93)

为什么我们必须将dart中的类重写hashCode==操作符注解为不可变?例如:

@immutable
class RandomClass {
  final Object identifier;

  const RandomClass({
    required this.identifier,
  });

  @override
  bool operator ==(Object other) {
    if (other is RandomClass) {
      return other.identifier == identifier;
    }
    return false;
  }

  @override
  int get hashCode => identifier.hashCode;
}

当我没有将RandomClass注解为不可变时,因为我重写了==运算符,所以会给我一个警告
我理解将一个类标记为不可变的effects,但我想知道为什么当一个类覆盖某些字段时我们必须这样做。

8cdiaqws

8cdiaqws1#

根据有效的dart文档(感谢@jamesdlin链接到它)。
当你定义==时,你还必须定义hashCode。这两个都应该考虑对象的字段。如果这些字段发生变化,则意味着对象的哈希代码可能会发生变化。
大多数基于散列的集合都没有预料到这一点--它们假定对象的散列代码将永远相同,如果不是这样,则可能会表现出不可预测的行为。

相关问题