2012-10-18 10 views
5

से एक विधि को पुनः आरंभ करने मैं इस तरह एक विधि है:कैसे अपने पिछले विफलता बिंदु

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

मैं इस एक आईडी के आधार पर कई बार runMethod कॉल करना चाहते हैं। हालांकि, अगर विधि 2() किसी कारण से विफल रहता है, तो जब मैं runMethod को कॉल करता हूं, तो उसे method3() निष्पादित करना चाहिए और विधि 1() को फिर से निष्पादित करने का प्रयास नहीं करना चाहिए (जो पहले से ही इस आईडी के लिए सफलतापूर्वक चलाया गया है)।

इसे प्राप्त करने का सबसे अच्छा तरीका क्या होगा?

धन्यवाद मदद

उत्तर

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

मुझे यकीन नहीं है कि यह होगा। मूल रूप से आपको केवल यह ट्रैक करने की आवश्यकता होती है कि इसे कॉल किया गया था, न कि यह विफल हुआ या सफल हुआ। तो यह हतरस के जवाब की तरह दिखना चाहिए। –

1

आप किसी प्रकार की राज्य मशीन की तलाश में हैं। डेटा संरचना (E.g मानचित्र) में विधि निष्पादन की स्थिति रखें।

विधि की शुरुआत में, आपको यह जांचने की आवश्यकता है कि दिए गए आईडी के लिए विधि 1 का निष्पादन सफलतापूर्वक निष्पादित किया गया है या नहीं।

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) 'के बाद होना चाहिए। यह है कि यदि मैं विधि 2() 'विफल होने पर दूसरी कॉल पर 'method1()' और 'method2()' को छोड़ना चाहता हूं, तो मैं सही ढंग से प्रश्न को समझ रहा हूं। –

+0

आपके उत्तर के लिए धन्यवाद। लेकिन मेरा परिदृश्य ऐसा है कि विधि 1 को लाइन के नीचे फिर से बुलाया जा सकता है। और मेरे पास 'एन' विधियों की संख्या है, प्रत्येक विधि मूल रूप से एक छोटा कदम संचालन कर रही है। इसलिए, यदि आप प्रत्येक विधि को एक चरण के रूप में देखते हैं, तो मुझे अभी भी एक ही विधि को फिर से कॉल करने की आवश्यकता हो सकती है, लेकिन अगर यह विफल हो जाता है, तो भी कोई कदम दोहराया जाना चाहिए। – Sai

+0

आईडी केवल अंत में जोड़ा जाना चाहिए, क्योंकि यदि "प्रसंस्करण" तर्क में कोई अपवाद फेंक दिया गया है, तो इसे सफलता नहीं माना जाता है और आईडी को "method1Executed" सेट में जोड़ा नहीं जाना चाहिए। – Htaras

1

मेरे समाधान जोड़ने के लिए एक पूर्णांक का सूचक है, बजाय नक्शे शुरू करने की है, खासकर अगर कोड अक्सर कहा जाता है होगा। वह कुछ इस तरह दिखेगा:

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

संबंधित मुद्दे