在Java中进行对象转换的简单/优雅方式?

时间:2009-01-07 19:44:31

标签: java

我必须接管并改进/完善一些将Java对象从第三方库转换为内部对象的代码。目前,这是通过一个大的if-else语句完成的:

if (obj instanceOf X)
{
    //code to initialize internal object
}
else if (obj instanceOf Y)
{
    //code to initialize different object
}
else if (obj instanceOf Z)
{
    //more init code
}
...

我个人认为这个解决方案并不令人满意;它变得冗长而混乱,更糟糕的是,许多if-else块包含更多if-else块处理子类和边缘情况。这个问题有更好的解决方案吗?

4 个答案:

答案 0 :(得分:7)

创建一个像这样的界面

public interface Converter<S,T> {
  public T convert(S source);
}

并为X,Y,Z的每个对象实现它。然后将所有已知的转换器放入Map中并获得快乐!

答案 1 :(得分:0)

虽然它不适用于边缘情况,但在类和转换器之间构建映射

X.getClass() - &gt; X转换器
Y.getClass() - &gt; Y转换器

会让你更接近。如果找不到叶子类,你还想检查超类。

答案 2 :(得分:0)

像这样的代码,包含所有instanceof条件,为界面尖叫!

您可能想要使用方法public interface Initializable创建public void initialize()

然后,如果你的if-else只是简单地解决了一个obj.initialize()电话。

答案 3 :(得分:0)

如果这些内部对象提供应用程序的接口,而不是直接使用,则调整它们而不是转换它们。

也就是说,如果你有这样的东西:

public class ThirdPartyClass { ... }
public interface InternalInterface { ... }
public class InternalClass { ... }

Internal foo(ThirdPartyClass thirdParty) {
    InternalClass internal = new InternalClass();
    // convert thirdPaty -> internal
    return internal;
}

然后做这样的事情:

public class ThirdPartyClass { ... }
public interface InternalInterface { ... }
public class InternalClass { ... }

public class ThirdPartyInternalAdapter implements InternalInterface {
    private final ThirdPartyClass thirdParty;
    public ThirdPartyInternalAdapter(ThirdPartyClass thirdParty) {
        this.thirdParty = thirdParty;
    }
    // implement interface in terms of thirdParty
}

从您的问题中不清楚这是否适用,但如果这样做,这可能比直接的对象到对象转换更容易和更有效。