【发布时间】:2017-06-21 14:09:58
【问题描述】:
假设我们有 Person 实体:
class Person {
/*
once the id is assigned, then must not be modified!
assume that the id will be assigned by the ORM framework
*/
int id;
String givenName;
String familyName;
}
我们有两个人:原始人和更新人:
Person original = new Person("Frantisek", "Makovicka");
Person updated = new Person("Viktor", "Makovicka");
我想将更新的 Person 与原来的 Person 合并,所以我写了以下简单的方法:
// return number of changed fields
public int merge(Person original, Person updated) {
int changes = 0;
String oldGivenName = original.givenName;
original.givenName = updated.givenName;
if (changed(oldGivenName, original.givenName)) changes++;
String oldFamilyName = original.familyName;
original.familyName = updated.familyName;
if (changed(oldFamilyName, original.familyName)) changes++;
return changes;
}
它工作正常,但我发现一些问题:
每次在 Person 类中添加新字段时,程序员不要忘记更新 merge() 方法,如果 Person 的字段非常多,那么维护这个方法会很困难。
所以我的问题是:是否有任何更智能/更强大的方法来合并对象的状态而不使用语言的反射功能,以便您可以确保合并所有且唯一需要的字段? 提前致谢!
UPD:
本来我问有没有不使用反射的写法,但忘了说不是限制!我还应该说我有一个想法,用反射+用一些自定义注释注释“可合并”字段来编写这个方法,然后跳过没有注释的字段。 所以,这些词的目的:“不使用反射”是为了发现其他可能不那么明显的解决方案:)
这个问题的灵感是这种函数式方法:(确保资源将被关闭,仅作为不太明显的解决方案和安全编程的示例)
public static void doWithResource(String name, Consumer<Resource> consumer) {
Resource res = new Resource(name);
consumer.accept(res);
res.close();
}
【问题讨论】:
-
更改未定义。你一定是指改变++。现在设置的方式,你总是会从上面的方法中得到 0。
-
您正在用更新的内容覆盖原始内容,在这种情况下,您可能应该只是覆盖原始指针,而不是调用合并方法。如果你必须这样做,我认为你正在寻找反思。 (主要区别是,如果这是扩展 Person 的两个不同的类,是否应该合并?)
-
你可以做一些反思,看看你班级的每个(可能是注释的)字段。
-
"不使用语言的反射特性" -- 为什么不呢?
-
@Inxsible 你是对的,这只是一个错字,已修复
标签: java merge maintainability