2012-10-18 17 views
5

bir yöntem yeniden başlatmak için. Ancak, eğer method2() bir nedenden ötürü başarısız olursa, o zaman runMethod dediğimde, method3() 'i çalıştırmalı ve method1()' i tekrar çalıştırmayı denememelidir (bu, bu id için başarıyla çalışmıştır).nasıl böyle bir yöntemi var onun son başarısızlık noktasına

Bunu başarmanın en iyi yolu ne olurdu?

sayesinde yardım

cevap

3

Bir yöntem başarıyla da yürütülür olup olmadığını bir haritada kayıt olabilir için çok.

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

Gerçekten de, o ben doğru soruyu okursanız da başarısız bir atlamak istiyor. –

+0

@jschoen İyi bir nokta, başarıların atlanıp başarısız olmadığının ima edilmesi için değişkenleri yanlış anladım. Ancak, kod hala aynı şekilde çalışır; sadece alanların yeniden adlandırılması gerekir. DÜZENLEME: Ve şimdi düzeltildi. – Vulcan

+0

Yapacağından emin değilim. Temel olarak sadece, eğer çağrılmışsa, başarısız olursa ya da başarılıysa, izlemeniz gerekir. Yani Htaras'ın cevabı gibi görünmeli. –

1

Bir çeşit durum makinesi arıyorsunuz. Veri yürütme işleminin durumunu bir veri yapısında tutun (E.g haritası).

Yöntemin başlangıcında, belirli bir kimlik için yöntem1'in yürütülmesinin başarılı bir şekilde yürütülüp yürütülmediğini kontrol etmeniz gerekir.

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

Değiştireceğim tek şey işlem yorumudur (kodun geri kalanının kodun nereye gitmesi gerektiği), method1Executed.add (id) 'den sonra gerçekleşmelidir. Yani, method2() 'başarısız olduğunda, ikinci çağrıya method1()' ve 'method2()' komutunu atlamayı istemekte doğru bir şekilde soruyu anlayabiliyorsam. –

+0

Cevabınız için teşekkür ederiz. Ama benim senaryoda, yöntem1 tekrar satırdan çağrılabilir. Ve 'n' yöntem sayısı var, her yöntem temelde küçük bir adım operasyonu yapıyor. Dolayısıyla, her yöntemi bir adım olarak görürseniz, yine aynı yöntemi tekrar aramak zorunda kalabilirim, ancak başarısız olsa bile hiçbir adım tekrarlanmamalıdır. – Sai

+0

id yalnızca sonuna eklenmelidir, çünkü "İşlem" mantığında herhangi bir istisna atılırsa, başarı olarak kabul edilmez ve "method1Executed" kümesine kimlik eklenmemelidir. – Htaras

1

Çözümümün kodu genellikle denir, özellikle yerine haritalar tanıtılması, bir int bir göstergesidir eklemek olacaktır. Böyle görünecektir:

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

Üçten fazla yöntem kullanılıyorsa bu oldukça karışık olabilir. – Vulcan