2012-12-13 381 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

中的適當位置,重構這些對象的情況下,以相互繼承,而不是重複的特性和邏輯。

在對象必須保持沉默的情況下,可以使用各種克隆工具中的任何一種來執行從對象到對象的深度複製。這是一個體面的,非詳盡列表:

相關問題