2016-03-15 59 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