假设我有一个包含许多实例变量的类。我想重载==运算符(和hashCode),以便我可以将实例用作映射中的键。
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类提供的==运算符来执行此操作?
答案 0 :(得分:10)
您正在寻找“identical”,它会检查2个实例是否相同。
identical(this, other);
更详细的例子?
class Person {
String ssn;
String name;
Person(this.ssn, this.name);
// Define that two persons are equal if their SSNs are equal
bool operator ==(Person other) {
return (other.ssn == ssn);
}
}
main() {
var bob = new Person('111', 'Bob');
var robert = new Person('111', 'Robert');
print(bob == robert); // true
print(identical(bob, robert)); // false, because these are two different instances
}
答案 1 :(得分:4)
您可以使用identical(this, other)
或super == other
。
答案 2 :(得分:0)
在一个不同但相似的注释中,在框架调用检查对象之间的相等性的情况下,例如如果使用 list.toSet()
从列表中获取唯一元素,则 identical(this, other)
可能不是一个选择。那时该类必须覆盖 == operator
和 hasCode()
方法。
但是对于这种情况,另一种方法可能是使用 equatable 包。这节省了大量样板代码,当您有很多模型类时尤其方便。