我有一个特殊情况,我已经实现了构建器模式。其中一个变量是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似乎不是一个好选择,因为我只需要单向转换。
如果有人有更好更简单的方法,请分享。
答案 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>