2014-11-03 165 views
1

我只想問一下,如果可以通過調用return;來檢查一個無效方法是否「取消」了它本身?我可以檢查一個void方法是否返回?

例如,在我主我打電話calculate(myArray);,其定義如下:

public static void calculate(Object[] array) { 
    if (array == null) 
     return; 
    // do stuff 
} 

是他們的一個辦法知道,如果它返回與否?我的想法是做一個「全局」布爾值,在我們返回之前將其更改爲true,然後在main中檢查其值,或者只是將返回類型更改爲int類型,並且在開始時返回時我們使用return -1;,並在方法return 0;

兩者都是可能的,但我認爲他們都不是很好的風格。有其他選擇嗎?

+3

讓它返回一個布爾值? – 2014-11-03 15:40:37

+6

'拋出新的NullPointerException(「Array is null」);'? – TNT 2014-11-03 15:40:55

+0

爲什麼它不是一個「好風格」? – Chiseled 2014-11-03 15:41:19

回答

2

不,你不能。從The Oracle Java tutorials - Returning a Value from a Method

任何聲明爲void的方法都不返回值。它不需要包含return聲明,但它可能會這樣做。在這種情況下,一個return語句可用於進行分支的控制流程塊的和退出的方法和簡單地使用這樣的:

return; 

有沒有從方法調用方法,以確定是否void方法由一個突破塊或return;聲明完成。

大多數其他方法包括返回類型boolean並返回false出現問題時,或者只是拋出IllegalArgumentException

+0

像西奧多羅斯Chatzigiannakis說,但從官方網站更多的解釋。謝謝你的澄清。 – Frozn 2014-11-03 17:52:12

5

你說得對,你描述的做法在Java(和其他現代語言)中被認爲是不好的。

最常見的爲您的方案可以接受的做法是:

  • 使該方法拋出異常。如果在正常情況下不應該發生「失敗」的代碼路徑,那麼這樣做。
  • 使方法的返回類型bool指示成功或失敗。如果在正常情況下「失敗」的代碼路徑也可以發生,那麼這樣做。
+0

我想我使用的方式機智h例外。對我來說看起來「更好」。也謝謝你。 – Frozn 2014-11-03 17:50:43

3

您可以利用出版商 - 監聽器模式:)

import java.awt.event.ActionListener; 
import java.util.LinkedList; 
import java.util.List; 

public class Sample { 

    private interface Event { 

    } 

    private static class ExitEvent implements Event { 

    } 

    private static class SucceedEvent implements Event { 

    } 

    private interface EventListener { 
     void eventPerformed(Event e); 
    } 

    private static List<EventListener> listeners = new LinkedList<EventListener>(); 

    private static void addActionListener(EventListener l) { 
     listeners.add(l); 
    } 

    private static void fireEvent(Event event) { 
     for (EventListener l : listeners) { 
      l.eventPerformed(event); 
     } 
    } 

    public static void calculate(Object[] array) { 
     if (array == null) { 
      fireEvent(new ExitEvent()); 
      return; 
     } 

     fireEvent(new SucceedEvent()); 
    } 

    public static void main(String[] args) { 

     addActionListener(new EventListener() { 

      public void eventPerformed(Event e) { 

       if (e instanceof ExitEvent) { 
        System.out.println("Exit"); 
       } else if (e instanceof SucceedEvent) { 
        System.out.println("Success"); 
       } 

      } 

     }); 

     calculate(null); 
     calculate(new Object[] {}); 

    } 

} 

輸出:

Exit 
Success 

你可以去得更遠,並刪除那些醜陋的IFS,利用訪問者模式

import java.util.LinkedList; 
import java.util.List; 

public class Sample { 

    private interface EventVisitor { 
     void visit(ExitEvent event); 

     void visit(SucceedEvent event); 
    } 

    private interface Event { 
     void accept(EventVisitor visitor); 
    } 

    private static class ExitEvent implements Event { 

     public void accept(EventVisitor visitor) { 
      visitor.visit(this); 
     } 

    } 

    private static class SucceedEvent implements Event { 

     public void accept(EventVisitor visitor) { 
      visitor.visit(this); 
     } 

    } 

    private interface EventListener { 
     void eventPerformed(Event e); 
    } 

    private static List<EventListener> listeners = new LinkedList<EventListener>(); 

    private static void addActionListener(EventListener l) { 
     listeners.add(l); 
    } 

    private static void fireEvent(Event event) { 
     for (EventListener l : listeners) { 
      l.eventPerformed(event); 
     } 
    } 

    public static void calculate(Object[] array) { 
     if (array == null) { 
      fireEvent(new ExitEvent()); 
      return; 
     } 

     fireEvent(new SucceedEvent()); 
    } 

    public static void main(String[] args) { 

     addActionListener(new EventListener() { 

      public void eventPerformed(Event e) { 

       e.accept(new EventVisitor() { 

        public void visit(SucceedEvent event) { 
         System.out.println("Success"); 

        } 

        public void visit(ExitEvent event) { 
         System.out.println("Exit"); 

        } 
       }); 

      } 

     }); 

     calculate(null); 
     calculate(new Object[] {}); 

    } 

} 

輸出:

Exit 
Success 
+0

沒有測試,看起來有點長,但很好。謝謝:) – Frozn 2014-11-03 17:46:34

+0

除非早期返回異常行爲是某種方式(應該幾乎不會發生),但此解決方案中的模式比拋出異常更好。 – ssube 2014-11-03 19:57:24

+0

這是個好主意,非常適合這種情況 - upvoted :)雖然應該進行額外的檢查以斷言線程安全,但演示很清晰且有幫助。做得好! – Unihedron 2014-11-04 09:23:47

相關問題