2009-01-07 31 views
1

我必须接管并完善/完成一些将Java对象从第三方库转换为内部对象的代码。目前,这是通过一个大的if-else语句的线沿线的完成:在Java中做对象转换的简单/优雅的方法?

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块。有没有更好的解决这个问题?

+0

可能,但没有更多关于您获得的对象的信息以及您基于它们执行的初始化类型,很难说 - 这是“依赖于”的答案之一。 – Rob 2009-01-07 19:47:19

回答

6

创建这样

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

的接口,并实现它为X,Y,Z的每一个对象。然后把所有已知的转换器放到一个Map中并且开心!

+0

这并没有什么帮助,因为泛型类型是静态的,所以你仍然需要做一堆instanceof来使用正确的Convert实例。 – cletus 2009-01-07 20:33:21

0

虽然它并不适用于边缘的情况下工作,建筑类和转换器

X.getClass()之间的映射 - > X转换
Y.getClass() - > Y转换

会让你更接近你。如果叶类没有找到,你也想检查超类。

0

这样的代码,其所有instanceof条件,尖叫的接口!

您可能想要创建一个public interface Initializable,方法public void initialize()

然后所有如果你的if-else的只是解析成一个单一的obj.initialize()调用。

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 
} 

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

相关问题