有两个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());
}

求平安
15 声望0 粉丝

家人平平安安。