假设我有一个类,有很多示例变量,我想重载==操作符(和hashCode),这样我就可以在Map中使用示例作为键。
class Foo {
int a;
int b;
SomeClass c;
SomeOtherClass d;
// etc.
bool operator==(Foo other) {
// Long calculation involving a, b, c, d etc.
}
}
比较计算的开销可能很大,因此在进行计算之前,我想检查other
是否与this
是同一个示例。
如何调用Object类提供的==操作符来完成此操作?
7条答案
按热度按时间xmakbtuz1#
这是我比较deep 2对象的方式,它们不一样:
b1payxdu2#
如果某个类
Foo
不 * 覆盖==
,那么默认实现是返回它们是否是同一个对象。documentation声明:所有对象的默认行为是当且仅当此对象和其他对象是同一对象时返回true。
rsaldnfx3#
在不同但类似的注意事项中,在框架调用检查对象之间的相等性的情况下,例如在
list.toSet()
从列表中获取唯一元素的情况下,identical(this, other)
可能不是一个选择。此时类必须覆盖== operator
和hasCode()
方法。然而,对于这种情况,另一种方法是使用equatable包,这节省了大量的代码,当你有很多模型类时特别方便。
mepcadol4#
可以使用Equatable库
因此,我们不需要手动覆盖
==
和hashcode()
方法,库将这样做。mo49yndu5#
当你试图比较两个通过引用传递的对象,比如class,List,Map,Set等...你需要将变量设置为常量变量才能比较它们,因为编译器通过address或hashCode来比较它们,就像下面的代码一样。
但是我们有一个很大的问题,我们可以在编译时将常量分配给定义的变量,而不能在运行时这样做,请参阅下面的解决方案:)
溶液1:
将需要覆盖hashCode和==方法,如下面的代码。
解决方案2 (最佳解决方案):
使用Equtable包
来源:
https://www.youtube.com/watch?v=DCKaFaU4jdk
https://api.flutter.dev/flutter/dart-core/Object/hashCode.html
6ovsh4lw6#
您正在查找“identical“,它将检查2个示例是否相同。
更详细的例子?
mgdq6dx17#
您可以使用
identical(this, other)
。