如何重构这种类型的switch-case语句?

时间:2013-10-26 05:12:52

标签: java refactoring

基于minIndex,我正在设置不同的视图可见性。我认为它可以以简单的方式重构。

switch (minIndex) {
    case 0:
        viewOne.setVisibility(View.VISIBLE);
        break;
    case 1:
        viewTwo.setVisibility(View.VISIBLE);
        break;
    case 2:
        viewThree.setVisibility(View.VISIBLE);
        break;
    case 3:
        viewFour.setVisibility(View.VISIBLE);
        break;
    case 4:
        viewFive.setVisibility(View.VISIBLE);
        break;
    case 5:
        viewSix.setVisibility(View.VISIBLE);
        break;
}

如何将此代码重构为更易读的代码?

2 个答案:

答案 0 :(得分:5)

如果数字与实际视图匹配得很好,则可以使用数组。

View[] views = new View[] {viewOne, viewTwo, viewThree, ...};
...
views[minIndex].setVisibility(View.VISIBLE);

答案 1 :(得分:1)

我假设您已为此站点匿名代码。我打算建议@Sotirios Delimanolis回答什么,但我认为你实际上做得太多而且做得太少。

您已将控制器绑定到视图太多,并且您已将视图绑定到彼此太多。为什么所有这些都应该在同一个switch声明中?

如果添加其他视图,您需要更改多少?

相反,您应该让每个视图使用包含PropertyChangeListener的对象注册minindex。顺便说一句,这个名字不好。当对象更改minindex时,它应该向所有侦听器发送PropertyChangeEvent。每个视图的侦听器都应检查事件是否希望该视图变为可见;如果是这样,视图应该自行唤醒。

class ViewController {
    private PropertyChangeSupport pcs = new PropertyChangeSupport();

    // delegate methods to add and remove listeners to pcs variable.

    private int viewIndex; // Changed for documentation.  Use String instead?

    public void setViewIndex(final int viewIndex) {
        int oldIndex = this.viewIndex;
        this.viewIndex = viewIndex; 
        pcs.firePropertyChange("viewIndex", oldIndex, this.viewIndex);
    }
}

class ViewOne {
    private ViewController vc;
    private final Integer myIndex = 1;

    // Constructor

    public void init() {
        // Never add this or an inner class to another object in a constructor.
        vc.addPropertyChangeListener("viewIndex",
            new PropertyChangeListener() {
                public propertyChange(final PropertyChangeEvent evt) {
                    if (myIndex.equals(evt.getNewValue()) {
                         setVisibility(View.VISIBLE);
                    }
                }
            });
    }
}

关于构造函数的警告是,如果您将this或内部类this公开给构造函数中的另一个对象,那么该外部对象在完全构造之前可能会与this进行交互。您可以在构造函数中构建PCL;使用另一种方法将其添加到控制器。