如何通过动态比较(选项/规则)来区分/比较具有嵌套对象的对象的两个实例以及更多实例。
所以基本上我不知道我需要比较哪些对象属性。选项/规则各不相同,由用户通过某些UI动态添加。当然,使用大量if语句可以很容易地创建大量方法。这不是我想要的——我有很多不同的对象需要这个功能。
我曾想过使用反射,但对于许多嵌套对象,这将如何处理?就像obj A有obj B一样。obj B有一个obj C的列表,每个C都有obj E??这会让反思变得非常复杂,对吧?
我也想过呼吸链,但我仍然不太清楚解决方案。
示例
假设我有一个对象A。这个对象包含一些标准数据类型:int、bool等。它还有一个对象B,然后它也有一些标准的数据类型。我现在有两个A的实例需要比较。但不仅仅是对所有属性进行简单比较(CompareTo)。只有用户或某些规则(最好是一些字符串)所说的内容需要进行比较。我该如何继续???
public class A {
int number;
boolean bool;
C other;
List<B> list;
public A (..... some args){ ... }
void dynamicCompare(A otherObj, String [] rules ){
// compare using args
}
}
public class B {
int number;
boolean bool;
D other;
public B (..... some args){ ... }
}
我认为责任链在这里对你没有帮助
这种模式是有意义的,因为你有一些请求要处理,但你不知道或不知道哪个对象会真正处理它。
为了实现这一点,你定义了一个具有特定顺序的对象链,每个对象都可以处理请求或将其留给链的下一个元素
在我们的案例中,我没有识别处理中的任何链或订单
对于你的要求,我想有两种方式。
1) 为应用程序用户提供真正的动态解决方案:引入您自己的查询语言或使用GraphQL等查询语言库。
背后的想法是为应用程序用户提供一种可能依赖于JSON或任何形式主义的请求语言,从后端来看,应用程序解析用户查询以处理它,并使用反射来识别对象的性质,并将其与相同类型的实例进行比较。
2) 不太动态的解决方案,需要更多的代码,但不需要查询语言,在编译时检查时更健壮
为用户可以作为请求传递的每种类型的对象引入一个查询类
例如:
public class QueryForObjectA{
private String fieldOne;
private Integer fieldTwo;
private QueryForObjectB queryForObjectB;
..
}
在这个类内部(或外部)引入了一种处理方法,将用户查询与一些objectsA
:进行匹配
...
public void List<ObjectA> match(List<ObjectA> objectsA){
List<ObjectA> matched = new ArrayList<>();
for (List<ObjectA> current : objectsA){
if (fieldOne != null && !fieldOne.equals(current.fieldOne)){
continue;
}
...
matched.add(current);
}
}