具有嵌套对象的对象的两个实例与动态(options / rules / args)进行比较

时间:2017-11-05 20:32:36

标签: java reflection compare comparison chain-of-responsibility

如何区分/比较对象的两个实例与嵌套对象以及更多重要 与动态比较(选项/规则)

所以基本上我不知道我需要比较的对象属性是什么。选项/规则各不相同,并由用户通过某些UI动态添加。当然,人们很容易用很多if语句创建很多方法。这不是我想要的东西我有很多不同的对象需要这个功能。

我曾想过使用 Reflection ,但是如何处理许多嵌套对象呢?像obj一样有obj B. Obj B有一个obj C列表,每个C都有obj E ??这会让反射变得非常复杂吗?

我还想过 Respoibllity链,但我仍然不太清楚解决方案..

示例

假设我有一个对象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 个答案:

答案 0 :(得分:1)

我不认为责任链会帮助你。
这种模式是有意义的,因为你有一些请求要处理,但你不知道或不知道哪个对象将实际解决它 为了实现它,您可以定义一个具有特定顺序的对象链,每个对象可以处理请求或将其留给链的下一个元素。
在我们的例子中,我没有在处理过程中识别任何链或订单。

根据您的要求,我想象两种方式。

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);
       }
 }