Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有标准的方法将对象转换为不同的对象?_Java_Design Patterns - Fatal编程技术网

Java 有没有标准的方法将对象转换为不同的对象?

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

我有一个特例,我实现了builder模式。其中一个变量的类型为ExternalClassA,其中传递给构建器的参数的类型为InternalClassA。目前我使用的方法如下:

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来回转换的“丑陋”逻辑现在都“隐藏”在适配器内部。

谢谢。这实际上是解决和冷却清洁到我实施