【发布时间】:2021-10-14 23:56:35
【问题描述】:
我想测试 2 个对象、同一类的 2 个不同实例是否具有所有相同的属性值;
(即,看看它们在逻辑上是否等价)。
我不想只检查它们是否是完全相同的对象(例如 this)。
而且我不想使用Equatable package,只是因为我不想将我的属性标记为final。
我想要的本质上是对 2 个对象的所有属性进行简单的深度比较。
【问题讨论】:
我想测试 2 个对象、同一类的 2 个不同实例是否具有所有相同的属性值;
(即,看看它们在逻辑上是否等价)。
我不想只检查它们是否是完全相同的对象(例如 this)。
而且我不想使用Equatable package,只是因为我不想将我的属性标记为final。
我想要的本质上是对 2 个对象的所有属性进行简单的深度比较。
【问题讨论】:
我认为您需要重写类中的两个方法来执行自定义比较。
== 运算符hashCode 吸气剂例如:
class MyObj {
String name;
MyObj(this.name);
@override
bool operator ==(Object o) {
if (o is MyObj && o.runtimeType == runtimeType) {
if (o.name == name) {
return true;
}
}
return false;
}
@override
int get hashCode => name.hashCode;
}
对此进行测试:
void main() {
MyObj objA = MyObj('billy');
MyObj objB = MyObj('bob');
MyObj objC = MyObj('billy');
print('object A == object B? ${objA == objB}');
print('object A == object C? ${objA == objC}');
}
应该产生:
object A == object B? false
object A == object C? true
要为多个属性覆盖 hashCode,也许可以查看 this discussion。
【讨论】:
Map 或List 属性,都可以使用DeepCollectionEquality().equals(o, this)(需要import 'package:collection/collection.dart';)。