有两个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());
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。