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

时间:2015-11-30 18:12:11

标签: java design-patterns

我有一个特殊情况,我已经实现了构建器模式。其中一个变量是ExternalClassA类型,其中传递给builder的参数类型为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函数(如http://www.leveluplunch.com/java/tutorials/016-transform-object-class-into-another-type-java8/中所述)。 Mapper似乎不是一个好选择,因为我只需要单向转换。

如果有人有更好更简单的方法,请分享。

3 个答案:

答案 0 :(得分:1)

当你说mapper时,你是什么意思?哪种设计模式是什么? 我熟悉的数据映射器明确用于持久存储described by Martin fowler

无论如何,我认为您可以使用Decorator模式的变体而无需添加功能。假设您可以从ExternalZ派生并覆盖getter,您可以创建一个包装InternalZ类的类。

class ExternalZOverInternalZ extends ExternalZ {
    private final InternalZ internalZ;

    ExternalZOverInternalZ(InternalZ internalZ) {
        this.interalZ = internalZ;
    }

    @Override
    public int getX() {
        return internalZ.getX();
    }
}

答案 1 :(得分:1)

目前你正在将一个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);

现在您可以按原样使用变量Z,并且IntToExtZAdapter内部将从InternalZ调整/转换为ExternalZ并返回。

从InternalZ到ExternalZ来回转换的所有“丑陋”逻辑现在都“隐藏”在适配器内部。

答案 2 :(得分:0)

如果你有可能为你的项目添加依赖项,谷歌的guava是一个不错的选择,它在旧版本的Java中提供函数(如Java 8)

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function.html

您可以使用

将其添加到maven
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>