2012-10-18 27 views
5

Tôi có một phương pháp như thế này:làm thế nào để khởi động lại một phương pháp từ thời điểm thất bại cuối cùng của nó

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

Tôi muốn gọi đây là runMethod nhiều lần dựa trên một id. Tuy nhiên, nếu nói method2() không thành công vì lý do nào đó, khi tôi gọi runMethod, nó sẽ thực thi method3() và không thử thực hiện method1() một lần nữa (đã chạy thành công cho id này).

Cách tốt nhất để đạt được điều này là gì?

Cảm ơn bạn rất nhiều vì đã giúp đỡ

Trả lời

3

Bạn có thể ghi lại trong bản đồ xem phương thức đã thực hiện thành công hay chưa.

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

Không thực sự mặc dù, anh ấy cũng muốn bỏ qua câu hỏi không thành công nếu tôi đọc câu hỏi một cách chính xác. –

+0

@jschoen Điểm tốt, tôi đặt tên cho các biến để ngụ ý những thành công cần được bỏ qua, không thành công. Tuy nhiên, mã vẫn hoạt động theo cùng một cách; chỉ cần đổi tên các trường. EDIT: Và bây giờ nó cố định. – Vulcan

+0

Tôi không chắc chắn nó sẽ. Về cơ bản bạn chỉ cần theo dõi nếu nó được gọi, không phải nếu nó không thành công hoặc thành công. Vì vậy, nó sẽ trông giống như câu trả lời Htaras. –

1

Bạn đang tìm kiếm một số loại máy trạng thái. Giữ trạng thái thực hiện phương thức trong cấu trúc dữ liệu (Ví dụ: bản đồ).

Khi bắt đầu phương pháp, bạn cần kiểm tra xem việc thực hiện phương thức 1 cho id đã cho có được thực hiện thành công hay không.

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

Chỉ có tôi sẽ thay đổi là nhận xét xử lý (mà tôi giả định là nơi mà phần còn lại của mã phương thức nên đi) sẽ xảy ra sau 'method1Executed.add (id)'. Đó là nếu tôi hiểu chính xác câu hỏi, về việc muốn bỏ qua 'method1()' và 'method2()' trong lần gọi thứ hai khi 'method2()' thất bại. –

+0

Cảm ơn bạn đã trả lời. Nhưng kịch bản của tôi là như vậy mà method1 có thể được gọi một lần nữa xuống dòng. Và tôi có 'n' số phương pháp, mỗi phương pháp về cơ bản là thực hiện một bước hoạt động nhỏ. Vì vậy, nếu bạn xem xét từng phương pháp như một bước, thì tôi vẫn có thể cần phải gọi lại cùng một phương thức, nhưng không bước nào được lặp lại, ngay cả khi nó không thành công.Chỉ nên thêm id – Sai

+0

vào cuối, bởi vì nếu bất kỳ ngoại lệ nào được đưa vào logic "Đang xử lý", thì không được coi là thành công và id không được thêm vào tập hợp "method1Executed". – Htaras

1

Giải pháp của tôi là thêm int là chỉ báo thay vì giới thiệu bản đồ, đặc biệt nếu mã được gọi thường xuyên. Nó sẽ trông giống như sau:

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

Điều này có thể khá lộn xộn nếu có nhiều hơn ba phương pháp đang được sử dụng. – Vulcan

Các vấn đề liên quan