如何使用嵌套对象等来区分/比较对象的两个实例重要使用动态比较(选项/规则)。
所以基本上我不知道我需要比较哪些对象属性。选项/规则各不相同,并且由用户通过某些 UI 动态添加。当然,我们可以轻松地使用大量 if 语句创建大量方法。这不是我正在寻找的东西,我有许多不同的对象需要此功能。
我考虑过使用反射,但是对于许多嵌套对象来说这会如何呢?就像obj A有obj B一样。Obj B有一个obj C的列表,每个C都有obj E??这会让反射变得相当复杂,对吗?
我也想过责任链,但我仍然不太清楚解决方案..
示例
假设我有一个对象 A。这个对象包含一些标准数据类型:int、bool 等。它还有对象 B,对象 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);
}
}
关于java - 具有嵌套对象的对象的两个实例与动态比较(选项/规则/参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47126336/