乐趣区

关于java:动态比较两个对象变更字段信息

有两个 Person 对象,咱们须要判断两个类对象的的年龄、姓名、性别、出生日期是否产生变更,如果变更项超过 2 个,则用等来进行代替。
举例:年龄、姓名、出生日期产生变更,则显示“年龄、姓名等信息产生变更”。
最容易想到的形式是每个字段比拟是否更新,而后应用 count 计数器来判断是否达到限度数量。如果是字段更多或者限度数量产生变更,代码复杂度相当高。能够思考应用反射,遍历对象 field 来进行判断。
整体代码如下:

class Person {
    String name;
    String sex;
    String age;
    Date birthDay;

    public Person(String name, String sex, String age, Date birthDay) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.birthDay = birthDay;
    }
}

// 能够指定哪些字段须要比拟,如果不须要比拟,则不定义即可
Map<String, String> compareColumns = new HashMap<String, String>() {
    {put("name", "姓名");
        put("sex", "性别");
        put("age", "年龄");
        put("birthDay", "出生日期");
    }
};

/**
 * 字符串格式化
 */
@Test
public void test5() {Person p1 = new Person("张三", "1", "13", new Date());
    Person p2 = new Person("李四", "1", "13", new Date());

    int count = 0;
    StringBuilder sb = new StringBuilder();

    for (Field declaredField : Person.class.getDeclaredFields()) {
        try {if (compareColumns.containsKey(declaredField.getName())) {declaredField.setAccessible(true);
                // 转成 string 比拟字符串内容
                Object obj1 = declaredField.get(p1);
                Object obj2 = declaredField.get(p2);
                if (Objects.nonNull(obj1) && !obj1.equals(obj2)) {if (count == 2) {sb.append("等信息已更新");
                        break;
                    }

                    if (count > 0) {sb.append(",");
                    }
                    sb.append(compareColumns.get(declaredField.getName()));
                    count++;
                }
            }
        } catch (IllegalAccessException e) {// log.info("initCustomerDetailCount:{}", e);
        }
    }

    System.out.println("compare result:" + sb.toString());
}
退出移动版