2016-04-06 113 views
0

不好意思的標題,但我真的不能想到這個信息標題。我將如何重構重複代碼?

我會直截了當這裏:

setName(); // set the name field 
validate(); // submit the form and check if form has error 

setName(); 
setAge(); 
validate(); 

setName(); 
setAge(); 
setHeight(); 
validate(); 

setName(); 
setAge(); 
setHeight(); 
setGender(); 
validate(); 

// the list goes on... 

我在網站上測試的形式和形式不應該允許任何空字段,但是在一個提交按鈕單擊我已經進入任何領域在之前得到清除,這就是爲什麼我需要像上面的代碼重新設置以前的領域。

什麼是寫這個更優雅的方式?我在想一個循環的,但後來我想不出合適的條件下...

回答

2

您可以爲每個動作的Runnable實例,並把它們放在一個列表中。

  • 在Java 8+:

    List<Runnable> runnables = new ArrayList<>(); 
    runnables.add(() -> setName()); 
    runnables.add(() -> setAge()); 
    runnables.add(() -> setHeight()); 
    // ... etc 
    
  • 對於早期版本的Java,您可以使用匿名類:

    runnables.add(new Runnable() { @Override public void run() { setName(); } }); 
    // ... etc 
    

,然後執行在該Runnable實例子列表runnables

for (int i = 0; i < runnables.size(); ++i) { 
    for (Runnable fn : runnables.subList(0, i + 1)) { 
    fn.run(); 
    } 
    validate(); 
} 

Demo

+0

嘿安迪,這看起來很有趣(我以前從未見過!)。然而,我得到'語法錯誤的標記,表達預期相反'錯誤,其中'runnables.add(() - >'是。這是什麼有關的JDK即時通訊版本使用?這是** J2SE-1.5 ** ? –

+1

您使用的是Java * 5 *您知道,不僅是Java 5的過去生活的結束,而且還有Java類6和7,右升級 - ?!這不是2004年更多的您將需要的Java 8使用此語法。編輯補充前的Java 8語法。 –

+0

我知道安迪,我知道,這讓我痛苦,因爲這是我不能只是簡單地升級Java版本的遺留項目(它會打破了很多東西,我們止跌」不管怎樣,感謝其他的建議,我一定會在回家的時候檢查一下,非常感謝!! –

1

我不確定到我是否完全明白你的問題(可能是引擎收錄,以工作示例將幫助),但也許你可以爲每個字段設置一個布爾值,檢查自上一次檢查後字段是否被修改過,然後根據這些布爾值的狀態設置字段?

的檢查方法就那麼所有的布爾值重置爲假(或任何方法實際上提交的變化)。

+0

不幸的是我無法改變的字段屬性....但感謝您的建議! –