用Java重构代码,替换大型if语句

Foo*_*Bar 11 java refactoring

我正在重构我正在处理的项目中的一些代码,并且遇到了一个跟随格式的大型if/else if语句:

if (changer instanceof AppleChanger)
{
   panel = new ApplePanel();
}
else if (changer instanceof OrangeChanger)
{
   panel = new OrangePanel();
} 
Run Code Online (Sandbox Code Playgroud)

现在我的第一个冲动是使用多态来重构它以使它看起来像

panel = changer.getChangerPanel();
Run Code Online (Sandbox Code Playgroud)

但遗憾的是,类包无法访问面板包.

我的下一个冲动是创建一个带有重载方法的PanelChooser类:

PanelChooser.getPanel(changer);

//Overloaded Method
public Panel getPanel(OrangeChanger changer)
{
   Panel orangePanel = new OrangePanel();
   return orangePanel;
}
public Panel getPanel(AppleChanger changer)
{
   Panel applePanel = new ApplePanel();
   return applePanel;
}
Run Code Online (Sandbox Code Playgroud)

这是一个很好的解决方案还是有更好的解决方法?

art*_*tol 13

这里的基本"问题"是你有并行的类层次结构.如果没有一些相当重的重构,你将无法替换if语句.一些建议在c2维基上.

您可以做的最好的,也可能是一个非常好的解决方案是将if语句移动到"工厂"类中,并确保它在其他任何地方都不会重复.