我正在尝试编写可以从实现相同接口的其他对象创建自己的域对象。我也在对其进行编码,以便他们可以将自己转换为其他实现,基本上是简单的域传输对象。我正在使用杰克逊在实现之间自动转换,以减少手动对象转换容易出错的样板。
用一个例子来展示可能更容易:
//base class
public abstract class DO<T extends Object> {
public abstract T toDTO();
public abstract DO<T> fromDTO(T t);
}
//concrete implementation
public class MyDO extends DO<MyDOInterface> implements MyDOInterface {
public MyDO fromDTO(MyDTO r){
ObjectMapper mapper = new ObjectMapper();
return mapper.convertValue(r, MyDO.class);
}
public MyDTO toDTO() {
ObjectMapper mapper = new ObjectMapper();
return mapper.convertValue(this, MyDO.class);
}
//getters and setters from MyDOInterface
}
现在这在创建 DTO 时可以正常工作,但反过来会有点痛苦。要创建我的域对象,我必须这样做:
MyDO myDO = new MyDO().fromDTO(aDTOInstance);
它创建了一个空对象,以便对其调用 fromDTO(...) 。
我有一种感觉,我错过了一些简单的东西,要么允许我在构造函数中传递 DTO,要么通过静态方法来避免这种情况。甚至是 DO 本身的工厂方法,但我无法弄清楚它是什么。任何人都可以看到使这项工作的方法吗?