为什么我们必须将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,但我想知道为什么当一个类覆盖某些字段时我们必须这样做。
1条答案
按热度按时间8cdiaqws1#
根据有效的dart文档(感谢@jamesdlin链接到它)。
当你定义==时,你还必须定义hashCode。这两个都应该考虑对象的字段。如果这些字段发生变化,则意味着对象的哈希代码可能会发生变化。
大多数基于散列的集合都没有预料到这一点--它们假定对象的散列代码将永远相同,如果不是这样,则可能会表现出不可预测的行为。