2012-12-13 247 views
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()); 

...等等...

有没有人知道以不同的方式来做这种东西?

+0

如果你所有的getter和setter都做的是get和set(不检查或者其他),那么就把这些变量公开。 – Doorknob

回答

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; 
    } 
} 
1

C Sharp有一个AutoMapper项目。

在它的要点中,它提供了一种将属性从源实例映射到源实例和目标实例可以是不同类的目标实例的简单方法。

此链接股份有关的类似项目了一些有趣的想法在Java中:Automapper for Java

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

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

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

相关问题