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