2012-10-18 6 views
5

Mam metodę tak:sposób, aby ponownie uruchomić metodę od ostatniego punktu awarii

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

chcę zadzwonić to runMethod wielokrotnie oparte na identyfikatorze. Jednakże, jeśli say method2() nie powiedzie się z jakiegoś powodu, to kiedy wywołuję runMethod, powinien wykonać metodę method3() i nie próbować ponownie wywoływać metody method1() (która już została pomyślnie uruchomiona dla tego id).

Jaki byłby najlepszy sposób, aby to osiągnąć?

dziękuję za pomocą

Odpowiedz

3

Można nagrywać na mapie, czy metoda została wykonana pomyślnie, czy nie.

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

Nie bardzo, ale chce pominąć nieudaną, także jeśli poprawnie przeczytam pytanie. –

+0

@jschoen Dobrze, błędnie nazwane zmienne, które sugerują sukcesy, powinny zostać pominięte, a nie nie. Jednak kod nadal działa w ten sam sposób; tylko nazwy pól muszą zostać zmienione. EDYCJA: A teraz jest naprawiony. – Vulcan

+0

Nie jestem pewien, czy tak. Zasadniczo musisz tylko śledzić, czy został wywołany, a nie, jeśli się nie udało. Powinien więc wyglądać bardziej jak odpowiedź Htaras. –

1

Szukasz pewnego rodzaju automatu stanów. Zachowaj stan wykonania metody w strukturze danych (np. Mapa).

Na początku metody należy sprawdzić, czy wykonanie metody 1 dla danego identyfikatora zostało wykonane pomyślnie, czy też nie.

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

Jedyne, co chciałbym zmienić, to komentarz przetwarzania (który zakładam, że reszta kodu metod powinna iść) po 'method1Executed.add (id)'. Jest tak, jeśli poprawnie rozumiem pytanie, o tym, że chcę pominąć 'method1()' i 'method2()' w drugim wywołaniu, gdy 'method2()' zawodzi. –

+0

Dzięki za odpowiedź. Ale mój scenariusz jest taki, że metoda 1 może zostać wywołana ponownie w linii. I mam 'n' liczbę metod, każda metoda jest zasadniczo wykonywana w małym stopniu. Jeśli więc traktujesz każdą z tych metod jako krok, to i tak mogę jeszcze wywołać tę samą metodę, ale żaden krok nie powinien się powtórzyć, nawet jeśli się nie powiedzie. – Sai

+0

id należy dodać tylko na końcu, ponieważ jeśli jakikolwiek wyjątek zostanie zgłoszony w logice "Processing", nie jest uważany za sukces, a id nie powinien być dodawany do zestawu "method1Executed". – Htaras

1

Moje rozwiązanie polegałoby na dodaniu int jest wskaźnikiem, zamiast wprowadzania map, szczególnie jeśli kod jest często wywoływany. Wyglądałoby to mniej więcej tak:

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

Może to być dość niechlujne, jeśli używa się więcej niż trzech metod. – Vulcan

Powiązane problemy