我可以检查是否返回了void方法?

时间:2014-11-03 15:38:46

标签: java arrays method-invocation return

我只是想问一下,是否有可能检查一个无效方法"取消"本人通过致电return;

例如,在我的主要部分,我致电calculate(myArray);,其定义如下:

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

他们是否有办法知道,如果它回来了?我的想法是制作一个全球性的" boolean在我们返回之前更改为true,然后在main中检查它的值,或者只是将返回类型更改为类似于int的类型,当它在开头返回时我们使用return -1;并在方法的末尾{{ 1}}

两者都有可能,但我认为它们都不是很好的风格。还有其他选择吗?

3 个答案:

答案 0 :(得分:5)

你说的是你所描述的做法在Java(和其他现代语言)中被认为是坏的。

您的方案最常见的可接受做法是:

  • 使方法抛出异常。如果在正常情况下不应发生“失败”代码路径,请执行此操作。
  • 使方法的返回类型bool表示成功或失败。如果在正常情况下也可能发生“失败”代码路径,请执行此操作。

答案 1 :(得分:3)

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

  

声明为void的任何方法都不会返回值。它不需要包含return语句,但它可以这样做。在这种情况下,return语句可以用于分支出控制流程块并退出方法,并且只是像这样使用:

return;

无法通过方法调用来确定void方法是否由落空块或return;语句完成。

大多数其他方法包含返回类型boolean,并在出现问题时返回false,或者只是抛出IllegalArgumentException

答案 2 :(得分: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