我有两个对象,每个对象有几十个字段:
Class1 {
int firstProperty;
String secondProperty;
...
}
Class2 {
int propertyOne;
String propertyTwo;
...
}
尽管某些字段的名称不同,但它们应具有相同的含义和目的,例如firstProperty
和propertyOne
。我想比较两个类的对象的“相似”字段实际上是否具有相同的值。
这样做最优雅的方法是什么?
答案 0 :(得分:3)
你在问如何处理这种疾病的症状 - 我建议改为治愈根本原因:通过踩回来完全重构你的课程。
具有“数十”字段的类很可能违反单一责任原则。
不要问自己如何比较字段 - 问问自己如何设计更少的字段,而实际上避免在多个地方拥有相同的信息!你应该(几乎)总是喜欢简单类的复杂网络而不是简单的复杂类网络。因为类是抽象的根,并且每个类仅包含实现类所属的 one 所需的内容。
除此之外:没有简单的通用方法也是 nice 。您当然可以编写一个使用反射来比较对象的实用程序类 - 您只需提供变量名称,并且该实用程序代码执行通用比较。但它简单而通用 - 但不是很好。
答案 1 :(得分:2)
有两个类具有相似含义的字段,我会考虑声明interface
。
Class1 implements MyInterface {
int firstProperty;
String secondProperty;
...
int getOne() {
return firstProperty;
}
String getTwo() {
return secondProperty;
}
}
Class2 implements MyInterface {
int propertyOne;
String propertyTwo;
...
int getOne() {
return propertyOne;
}
String getTwo() {
return propertyTwo;
...
}
interface
的默认实现为isEqualTo
:
MyInterface {
int getOne();
String getTwo();
...
boolean isEqualTo(MyInterface that) {
return that != null &&
this.getOne() == that.getOne() &&
this.getTwo().equals(that.getTwo()) && //add null checks!
...;
}
}
存在被覆盖isEqualTo
的风险 - 确保它永远不会发生。
答案 2 :(得分:0)
通过特定字段比较不同类别的对象正是 https://github.com/nejckorasa/compare-utils 解决的情况。
示例:
ObjectCmp.equalEqualityPairs(
object1,
object2,
Arrays.asList(
EqualityPair.of(o1 -> o1.getFirstProperty(), o2 -> o2.getPropertyOne()),
EqualityPair.of(o1 -> o1.getSecondProperty(), o2 -> o2.getPropertyTwo())));
看看,这可能会有用!