我必须接管并改进/完善一些将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块处理子类和边缘情况。这个问题有更好的解决方案吗?
答案 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
}
从您的问题中不清楚这是否适用,但如果这样做,这可能比直接的对象到对象转换更容易和更有效。