具有嵌套对象的对象的两个实例与动态比较(options/rules/args)
Two instances of an object with nested objects compare with dynamic (options/rules/args)
如何 differ/compare 具有嵌套对象和更多对象的两个实例 重要 动态比较 (options/rules)。
所以基本上我不知道我需要比较哪些对象属性。 options/rules 变化并由用户通过一些 UI 动态添加。当然,可以很容易地用很多 if 语句创建很多方法。这不是我要找的东西,我有许多不同的对象需要此功能。
我考虑过使用 Reflection,但这对许多嵌套对象有何影响?就像 obj A 有 obj B。Obj B 有一个 obj C 列表,每个 C 都有 obj E??那会使反射变得非常复杂,对吧?
我也想到了责任链,但我还是不太清楚解决方案..
例子
假设我有一个对象 A。该对象包含一些标准数据类型:int、bool 等。它还有对象 B,后者也有一些标准数据类型。我现在有 2 个 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) 较少的动态解决方案,需要更多的代码,但不需要查询语言,并且在编译时检查时更健壮。
为用户可能作为请求传递的每种类型的对象引入一个查询 class。
例如:
public class QueryForObjectA{
private String fieldOne;
private Integer fieldTwo;
private QueryForObjectB queryForObjectB;
..
}
并且在这个class里面(或者外面)引入一个处理方法来匹配用户查询和一些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);
}
}
如何 differ/compare 具有嵌套对象和更多对象的两个实例 重要 动态比较 (options/rules)。
所以基本上我不知道我需要比较哪些对象属性。 options/rules 变化并由用户通过一些 UI 动态添加。当然,可以很容易地用很多 if 语句创建很多方法。这不是我要找的东西,我有许多不同的对象需要此功能。
我考虑过使用 Reflection,但这对许多嵌套对象有何影响?就像 obj A 有 obj B。Obj B 有一个 obj C 列表,每个 C 都有 obj E??那会使反射变得非常复杂,对吧?
我也想到了责任链,但我还是不太清楚解决方案..
例子
假设我有一个对象 A。该对象包含一些标准数据类型:int、bool 等。它还有对象 B,后者也有一些标准数据类型。我现在有 2 个 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) 较少的动态解决方案,需要更多的代码,但不需要查询语言,并且在编译时检查时更健壮。
为用户可能作为请求传递的每种类型的对象引入一个查询 class。
例如:
public class QueryForObjectA{
private String fieldOne;
private Integer fieldTwo;
private QueryForObjectB queryForObjectB;
..
}
并且在这个class里面(或者外面)引入一个处理方法来匹配用户查询和一些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);
}
}