基于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;
}
如何将此代码重构为更易读的代码?
答案 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;使用另一种方法将其添加到控制器。