在Dart中取消对’==’和’.hashCode’的神秘化

今天,我遇到了一个博客(Patrice Chalin为Dart类定义了相等性(==)和hashCode)。 我问了一个明显的问题:“为什么要这样做?”。

它的简单答案是对对象实施我们自己的相等性检查 (不是相同的检查; 完全相同是不同于equals的东西)。 例如,您正在制作待办事项列表类型的应用,并且您要阻止用户两次添加相同的待办事项 (仅以此为例,以了解即将发布的代码;当然,还有许多其他更好的方法可以做到这一点)。

因此,让我们从简单的原始代码开始:

以上代码不言自明; 这里没什么复杂的。 我们创建了一个Todo类,并编写了一些代码行,这些代码行打印hashCode(s),并检查两个给定对象(在我们的示例中具有相同的数据字段)是否相等和相同。
请注意,即使提供的数据相同,但两者均未通过相等性检查。 同样的测试也失败了

现在,我们执行自己的相等性测试:

在这里,我们编写了自己的相等性检查代码 ,该代码仅检查两个对象中相应字段的相等性并基于该对象返回布尔值。 参见均等测试结果为true 。 这就是我们想要的。 只要两个待办事项相等,我们就不会让用户保存该待办事项。 似乎我们完成了这项工作。

可是等等! 让我们深入了解一些基础知识。 您知道hashMap或其他类似方法都适用于使用输入对象的hashCode的索引。 您可以在上面的图片中看到,即使对象相等,但它们具有不同的 hashCodes也可能使事情变得混乱。 看看这个讨论。

建议的做法是,还应使用==方法覆盖hashCode方法。 因此,我们现在实现自己的提供hashCode的方式,以便每当两个对象通过我们的相等性测试时,它们实际上应该相等。

(这里我只是使用一种逻辑来生成一个hashCode。您可以按照自己喜欢的方式定义它)
现在,您可以看到打印的两个hashCode相等。 因此,hashMap等中可能出现的问题现在消失了。 大! 我们的工作现在完成了。

最后,您必须已经看到,在每种情况下, 相同的检查总是返回false 。 为什么这样?
如果您在此处查看其文档。 相同的功能:

“检查两个引用是否指向同一个对象。”

因为一开始我们要创建两个实例,所以无论我们改变它们的内在价值如何,它们都应该是不同的。 这就是为什么相同的检查在我们的情况下总是返回false的原因

上面的代码不是很常用,但是在想要使用自定义相等性检查代码的地方仍然很有用。

哇! 你和我今天都学到了一些新东西。 恭喜
拍! 拍! 拍!

进一步阅读:
1. https://stackoverflow.com/questions/13275506/what-is-the-difference-between-and-in-dart
2. https://stackoverflow.com/questions/2707541/why-should-i-override-hashcode-when-i-override-equals-method
3. http://pchalin.blogspot.com/2014/04/defining-equality-and-hashcode-for-dart.html