[英]How to refactor nested switch-case (Java) or when (Kotlin)?
[英]How to Refactor this type of switch-case statement?
基於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;
}
如何將該代碼重構為更具可讀性的代碼?
如果數字與實際視圖很好地匹配,則可以使用數組。
View[] views = new View[] {viewOne, viewTwo, viewThree, ...};
...
views[minIndex].setVisibility(View.VISIBLE);
我認為您已經對該網站的代碼進行了匿名處理。 我本來建議@Sotirios Delimanolis回答了什么,但我認為您實際上做得太多了也太少了。
您已將控制器與視圖的綁定過多,並且已將視圖彼此的綁定過多。 為什么它們都應該在同一switch
語句中?
如果添加其他視圖,則需要更改多少?
相反,您應該讓每個視圖向持有minindex
的對象注冊一個PropertyChangeListener
。 順便說一句,這真是個壞名字。 當對象更改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。 使用另一種方法將其添加到控制器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.