Java 有没有标准的方法将对象转换为不同的对象?
我有一个特例,我实现了builder模式。其中一个变量的类型为ExternalClassA,其中传递给构建器的参数的类型为InternalClassA。目前我使用的方法如下:Java 有没有标准的方法将对象转换为不同的对象?,java,design-patterns,Java,Design Patterns,我有一个特例,我实现了builder模式。其中一个变量的类型为ExternalClassA,其中传递给构建器的参数的类型为InternalClassA。目前我使用的方法如下: Class Parent { String variableX; int variableY; ExternalZ variableZ; public static builder { .... ExternalZ varz; /* .. builder logic */ p
Class Parent {
String variableX;
int variableY;
ExternalZ variableZ;
public static builder {
....
ExternalZ varz;
/* .. builder logic */
private builder withExternalZ(InternalZ internalZ) { //This is the transform method I'm using currently
this.variableZ.getSomeObject().setX(this.internalZ.getSomeObject().getX()); //Similar kind of lines making my transform method look ugly
}
}
有没有办法让我的withExternalZ方法看起来更简单?目前,我正在考虑实现Mapper模式或Java8函数(如中所述)。映射器似乎不是一个好的选择,因为我只需要单向转换
如果有人有更好更简单的方法,请分享。如果您有可能为您的项目添加依赖项,google的guava是一个不错的选择,它在旧版本的Java中提供了功能(如Java 8) 您可以使用将其添加到maven
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
番石榴
番石榴
18
你说“地图绘制者”是什么意思?那是哪种设计模式?
我熟悉的数据映射器被显式地用作持久存储
无论如何,我认为您可以使用装饰器模式的变体,而无需添加功能。假设可以从ExternalZ派生并重写getter,那么可以创建一个封装InternalZ类的类
class ExternalZOverInternalZ extends ExternalZ {
private final InternalZ internalZ;
ExternalZOverInternalZ(InternalZ internalZ) {
this.interalZ = internalZ;
}
@Override
public int getX() {
return internalZ.getX();
}
}
当前,您正在将InternalZ实例传递给withExternalZ()方法,该方法实际上需要\预期一个ExternalZ对象。但您手头上有一个InternalZ方法 适配器模式是为这样的场景构建的,因为它将目标接口(InternalZ)适配/转换为客户机期望的接口(ExternalZ)。简而言之,您需要编写一个适配器,将InternalZ对象转换为ExternalZ对象。适配器类代码大致如下所示:
public class IntToExtZAdapter extends ExternalZ{
InternalZ internalZ=null;
public IntToExtZAdapter(InternalZ internalZ){
this.internalZ=internalZ;
}
public X getX(){
//Logic for getting X from internalZ object in adapter
}
public setX(X x){
//Logic for setting X in internalZ object in adapter
}
//...and so on
}
那么与其这样做——
private builder withExternalZ(InternalZ internalZ) { //This is the transform method I'm using currently
this.variableZ.getSomeObject().setX(this.internalZ.getSomeObject().getX()); //Similar kind of lines making my transform method look ugly
}
你现在要做的是-
this.variableZ=new IntToExtZAdapter (internalZ);
现在您可以按原样使用variableZ,内部IntToExtZaAdapter将从InternalZ调整/转换为ExternalZ并返回
所有从InternalZ到ExternalZ来回转换以及从InternalZ到ExternalZ来回转换的“丑陋”逻辑现在都“隐藏”在适配器内部。谢谢。这实际上是解决和冷却清洁到我实施