2014-11-03 168 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

相关问题