Flutter Equatable 用于部分不可变类

问题描述 投票:0回答:1

Dart 说避免可变类上的相等

避免为可变类定义自定义相等性

当您定义

==
时,您还必须定义
hashCode
。这两者都应该考虑到对象的字段。如果这些字段更改,则意味着对象的哈希码可以更改。

大多数基于哈希的集合并没有预料到这一点——它们假设对象的哈希码将永远相同,如果情况并非如此,则可能会出现不可预测的行为。

这很合理。但是,如果类具有不可变部分(例如计算哈希码和相等性的唯一 ID,以及其他应被忽略的可变属性),情况又如何呢?这不可能吗?

flutter dart equality hashcode
1个回答
0
投票

引用您链接并参考的Effective Dart:设计部分:

避免为可变类定义自定义相等性

当您定义

==
时,您还必须定义
hashCode
。这两者都应该考虑到对象的字段。如果这些字段更改,则意味着对象的哈希码可以更改。

大多数基于哈希的集合并没有预料到这一点——它们假设对象的哈希码将永远相同,如果情况并非如此,则可能会出现不可预测的行为。

指南中给出的避免自定义相等的唯一原因是为了防止基于哈希的集合在对象的哈希代码发生更改时出现不可预测的行为。在您给出的哈希码在对象构造后无法更改的场景中这是不可能的。因此,定义

==
hashCode
或这样的对象应该是安全的(如果可能不一致)。

© www.soinside.com 2019 - 2024. All rights reserved.