这不是我第一次发现自己处于一种情况,我必须使用几乎相同的数据来调整两个对象,例如:
User.java (Object returned from another library)
private String name;
private String surname;
private String email;
private String telephone;
...
getters and setters();
constructor();
MyUser.java
private String name;
private String surname;
private String email;
private String telephone;
...
getters and setters();
constructor();
我通常会创建一个方法将一个对象转换为另一个对象,如下所示:
User m1 = new User();
MyUser m2 = new MyUser();
m2.setName(m1.getName());
m2.setsurmame(m1.getsurname());
......等等......
有人知道做这种事的不同方法吗?
答案 0 :(得分:1)
C Sharp有一个AutoMapper项目。
在它的要点中,它提供了一种简单的方法,可以将属性从源实例映射到目标实例,其中源实例和目标实例可以是不同的类。
此链接分享了有关Java中类似项目的一些有趣想法:Automapper for Java
答案 1 :(得分:1)
您可以做的一件事是将User
对象传递给MyUser
类的方法或MyUser
类的构造函数,然后执行这些setter。
使用构造函数:
public MyUser(User u){
setName(u.getName());
setSurname(u.getSurname());
...
}
或者创建一个单独的方法:
public void setMyUser(User u){
setName(u.getName());
setSurname(u.getSurname());
...
}
然后你可以像这样使用它:
User u = new User();
//hope all values are set in User u object
MyUser m = new MyUser(u);
答案 2 :(得分:1)
在适当的情况下,重构这些对象以相互继承,而不是重复属性和逻辑。
如果对象必须保持distint,您可以使用各种克隆工具中的任何一种来执行从一个对象到另一个对象的深层复制。这是一个体面的,非详尽的清单:
答案 3 :(得分:0)
使用Object Composition对于使用其他库创建的对象,请创建ExternalUser
的实例。但是如果要在本地创建它们,请创建BrandNewUser
。然后你可以用同样的方式处理它们,一个版本使用传递合成方法,代码使用你自己的内部实现创建。
您可以像这样创建对象:
public interface MyUser {
// all the methods you need
String getSurname();
}
public class ExternalUser implements MyUser {
private User _user;
private ExternalUser() { }
public ExternalUser(User u) {
this._user = u;
}
public String getSurname() {
return _user.getSurname();
}
}
public class BrandNewUser implements MyUser {
private String _surname;
public ExternalUser(String name, String surname) {
this._surname = surname;
}
public String getSurname() {
return _surname;
}
}
答案 4 :(得分:0)
也许您可以使用提供复制属性功能的beanutils。 http://commons.apache.org/beanutils/