在Java中对象修补更新属性的智能方法

时间:2018-06-11 12:23:55

标签: java

所以我想知道是否有一个简单的清洁而不是太多的锅炉电镀解决方案来更新java中的Object。所以这里基本上是我想要实现的,以及我可以开展工作的替代解决方案,但在我看来这有点麻烦/乏味:

public class User {
    private String name;
    private Address address;
    private String phoneNumber;
    private Integer age;

    //Wanted solution
    public void patchUser(User otherUser) throws ClassNotFoundException, IllegalAccessException {
        for (Field field : Class.forName(User.class.getName()).getDeclaredFields()) {
            field.setAccessible(true);
            if (field.get(otherUser) != null) {
                this.field = field;
            }
        }
    }

    //Alternate working solution
    public void patchUser2(User otherUser) {
        if (!this.getName().equalsIgnoreCase(otherUser.getName())) {
            this.setName(otherUser.getName());
        }

        if (!this.getAddress().equals(otherUser.getAddress())) {
            this.setAddress(otherUser.getAddress());
        }

        //... etc.
    }

}

所以第一个patchUser(...)方法就是我希望实现的方法,如果可能的话我似乎无法弄明白。如果我向我的用户添加一个新字段会很好,那么在第一个选项中会自动处理这个字段,而在第二个解决方案中,我必须记住手动添加字段的检查。

编辑1 所以我要找的是我是否已经提供给用户对象:

OldUserObject {
   "name": "John",
   "Address": {
      "Street": "Avenue 1"
   },
   "phoneNumber": "12345678",
   "age": 37      
}

NewUserObject {
       "name": "Peter",
       "Address": null,
       "phoneNumber": "12345679",
       "age": null      
    }

所以OldUserObject就是我现在用户注册时他想要更改一些关于他自己的信息所以我收到一个新对象并根据用户想要改变的内容我只得到那些值他/她想要更改的字段,其他字段可能为null,如上例所示,如果它们是如此或者如果它们未更改,则不应更新旧对象,因此我最终会得到一个对象:

OldUserObject {
       "name": "Peter",
       "Address": {
          "Street": "Avenue 1"
       },
       "phoneNumber": "12345679",
       "age": 37      
  }

1 个答案:

答案 0 :(得分:0)

我会选择“改进”的第二种方式 使用Optional来保持干净且非常直接:

class Test{
    private String s;
    private int i;

    public Test(String s, int i){
        this.s = s;
        this.i = i;
    }

    public void patchTest(Test t){
        Optional.ofNullable(t.s).ifPresent(this::setS);
        Optional.ofNullable(t.i).ifPresent(this::setI);
    }

    //setter setS and setI
}

现在,这是一个简单的示例,但可以使用映射以更通用的方式执行此操作。