java - 具有嵌套对象的对象的两个实例与动态比较(选项/规则/参数)

标签 java reflection compare comparison chain-of-responsibility

如何使用嵌套对象等来区分/比较对象的两个实例重要使用动态比较(选项/规则)

所以基本上我不知道我需要比较哪些对象属性。选项/规则各不相同,并且由用户通过某些 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/

相关文章:

java - CircularArrayQueue 实现 Java

Scala:如何检查是否至少定义了一个类的字段?

arrays - 整数数组的校验和?

java - 双重检查锁定作为反模式

java - Java 急切评估 : How does this example work?

java - 如何在java反射中获取注解值

C#如何调用参数数量未知的方法

c++ - 比较两个对象之间的实例。 C++

php - 如何比较同一个 MySQL 表中不同行的不同列(在 php 中)?

java - 未调用来自 PopupWindow 的 Android ListView 的 setOnItemClickListener