2012-10-18 59 views
5

重啓的方法我有一個方法是這樣的:如何從上次的故障點

public void runMethod() 
    { 
    method1(); 
    method2(); 
    method3(); 
    } 

我想打電話給這個runMethod基於ID多次。但是,如果說方法2()由於某種原因失敗,那麼當我調用runMethod時,它應該執行method3(),而不是嘗試再次執行method1()(它已經成功運行此id)。

什麼是最好的方法來實現這一目標?

非常感謝您的幫助

回答

3

你可以在地圖的方法是否成功,或不執行記錄。

private Map<String, Boolean> executes = new HashMap<String, Boolean>(); 

public void method1() { 
    Boolean hasExecuted = executes.get("method1"); 
    if (hasExecuted != null && hasExecuted) { 
     return; 
    } 
    executes.put("method1", true); 
    ... 
} 

// and so forth, with method2, method3, etc 
+0

不是真的,雖然,他想跳過一個失敗也,如果我正確讀取的問題。 –

+0

@jschoen好的一點,我錯誤地指出應該跳過成功的變量,而不是失敗。但是,代碼仍然以相同的方式工作。只有字段需要重新命名。編輯:現在它是固定的。 – Vulcan

+0

我不確定會。基本上你只需要追蹤它是否被調用,而不是失敗或成功。所以它應該看起來更像Htaras的答案。 –

1

您正在尋找某種狀態機。保持數據結構中的方法執行狀態(例如,地圖)。

在方法開始時,您需要檢查給定id的method1執行是否成功執行。

public void runMethod() 
{ 
    method1(); 
    method2() 
    method3(); 
} 
private Set<Integer> method1Executed = new HashSet<Integer>(); 
private Set<Integer> method2Executed = new HashSet<Integer>(); 

private void method1(Integer id) 
{ 
    if (method1Executed.contains(id)) { 
     return; 
    } 
    // Processing. 
    method1Executed.add(id) 
} 

// Similar code for method2. 
+0

唯一我會改變的是處理註釋(我假設其餘的方法代碼應該去哪裏)應該在'method1Executed.add(id)'之後發生。這就是說,如果我正確地理解了這個問題,那麼當method2()失敗時,想要在第二次調用時跳過'method1()'和'method2()'。 –

+0

感謝您的回覆。但是我的情況是這樣的,方法1可能再次被調用。而且我有多少種方法,每種方法基本上都是一個小步驟操作。因此,如果您將每種方法視爲一個步驟,那麼我可能仍需要再次調用相同的方法,但即使失敗,也不應重複執行任何步驟。 – Sai

+0

只應在最後添加id,因爲如果在「Processing」邏輯中拋出任何異常,則不會將其視爲成功,並且不應將id添加到「method1Executed」集中。 – Htaras

1

我的解決方案是添加一個int是一個指標,而不是引入地圖,特別是如果經常調用代碼。 這將是這個樣子:

public int runMethod(int flag) { 
    if (flag < 1) { 
     method1(); 
     if (method1failed) { 
      return 1; 
     } 
    } 
    if (flag < 2) { 
     method2(); 
     if (method2failed) { 
      return 2; 
     } 
    } 
    if (flag < 3) { 
     method3(); 
     if (method3failed) { 
      return 3; 
     } 
    } 
    return 4; 
} 
+0

如果使用三種以上的方法,這可能會變得相當混亂。 – Vulcan