0

这不是我第一次发现自己必须使用几乎相同的数据来调整两个对象,例如:

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());

...等等...

有人知道做这种事情的不同方法吗?

4

5 回答 5

1

C Sharp 中有一个AutoMapper项目。

概括地说,它提供了一种将属性从源实例映射到目标实例的简单方法,其中源实例和目标实例可以属于不同的类。

这个链接分享了一些关于 Java 中类似项目的有趣想法:Automapper for Java

于 2012-12-13T17:43:34.357 回答
1

您可以做的一件事是将该User对象传递给类的方法MyUser或类的构造函数,MyUser然后执行这些设置器。

使用构造函数:

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);
于 2012-12-13T17:47:34.863 回答
1

使用对象组合对于使用其他库创建的对象,创建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;
  }
}
于 2012-12-13T17:51:27.027 回答
1

在适当的情况下,重构这些对象以相互继承,而不是重复属性和逻辑。

在对象必须保持不同的情况下,您可以使用多种克隆工具中的任何一种来执行从对象到对象的深度复制。这是一个体面的,非详尽的列表:

于 2012-12-13T17:51:46.313 回答
0

也许您可以使用提供复制属性功能的 beanutils。 http://commons.apache.org/beanutils/

于 2012-12-13T17:52:11.253 回答