2016-03-15 62 views
1

我想將一個不可變對象轉換爲另一個不可變對象。我搜索了一下,發現Dozzer和Orika主要用於對象映射。將不可變對象轉換爲不可變對象(不可變或生成器)

我嘗試使用Dozzer,但似乎它不適用於使用生成器模式創建的對象。

Example: 
//Source Object 
public class EmployeeDTO{ 
private String id; 
private String name; 

private void setName(String name){this.name=name;} 
private void setId(String id){this.id=id;} 

public static class Builder{ 
public String id; 
public String name; 
public Builder setName(String name){this.name=name;} 
public Builder setId(String id){this.id=id;} 

public EmployeeDTO build(){ 
    EmployeeDTO employeeDTO = new EmployeeDTO(); 
employeeDTO.setName(this.name); 
employeeDTO.setId(this.id); 
return employeeDTO; 
} 
} 
} 

//Target Object 
public class Employee{ 
private String id; 
private String name; 

private void setName(String name){this.name=name;} 
private void setId(String id){this.id=id;} 

public static class Builder{ 
public String id; 
public String name; 
public Builder setName(String name){this.name=name;} 
public Builder setId(String id){this.id=id;} 

public Employee build(){ 
    Employee employee = new Employee(); 
employee.setName(this.name); 
employee.setId(this.id); 
return employee; 
} 
} 
} 

我想交換這兩個結構。我不知道我可以創建自定義映射器來執行此任務。如果可以用Dozzer/Orika以簡單的方式進行操作,請幫助我。

+0

的源和目標對象具有公共字段和設置者。他們如何不變呢? –

+0

感謝Adam糾正我。我只是把它編碼在這裏,所以把錯誤的字段/方法公諸於衆。糾正它。 – user3089214

回答

0

公共類SourceObjectClass實現Ť{

private final String name; 

private final int id; 

public sourceObjectClass(final String name, final int id){ 

    this.name = name; 
    this.id = id; 
} 

public String getName(){ 

    return name; 
} 

public String getId(){ 

    return id; 
} 

}

//目標對象

公共類DestinationObjectClass實現Ť{

private final String name; 

private final int id; 


public sourceObjectClass(final String name, final int id){ 

    this.name = name; 
    this.id = id; 
} 

public String getName(){ 

    return name; 
} 

public String getId(){ 

    return id; 
} 

}

//轉換

//轉換

公共類MyConverter {

public static T convert(SourceObjectClass sourceObject, Class<T> destinationClass){ 

    Class definition = Class.forName(destinationClass); 

    return definition.newInstance(sourceObject.getName(),sourceObject.getId()); 
} 

}

公共類MyTestClass {

public static void main(String args[]){ 

    //Create an immutable object 
    SourceClasssObject sourceObject = new SourceClassObject("Guest",100); 

    //convert the above object into another immutable Object 
    final DestinationObjectClass destination = MyConverter.convert(sourceObject,DestinationObjectClass.class); 
} 

}

+0

次要評論: 類定義= Class.forName(destinationClass.toString());無論如何,我不再需要它,如果有人必須這樣做,這將是非常糟糕的方式來做到這一點。那麼手動轉換會更好。不是嗎? – user3089214

+0

你可以使用反射概括這個邏輯,這樣你就可以擺脫調用getter。 – user2579273