2

我只是想问一下,是否可以通过调用来检查 void 方法是否“取消”了自身return;

例如在我的 main I callcalculate(myArray);中,它的定义如下:

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

他们是一种知道它是否返回的方法吗?我的想法是制作一个“全局”布尔值,在我们返回之前将其更改为 true,然后在 main 中检查它的值,或者只是将返回类型更改为 int 之类的东西,当它在我们使用的开头return -1;和结尾返回时方法return 0;

两者都是可能的,但我认为它们都不是很好的风格。有替代方案吗?

4

3 回答 3

5

你是对的,你描述的做法在 Java(和其他现代语言)中被认为是不好的。

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

  • 使方法抛出异常。如果“失败”代码路径在正常情况下不应该发生,请执行此操作。
  • 使方法的返回类型bool指示成功或失败。如果在正常情况下也可能发生“失败”代码路径,请执行此操作。
于 2014-11-03T15:45:58.710 回答
3

你不能。来自Oracle Java 教程 - 从方法返回值

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

return;

方法调用无法确定该void方法是由失败块还是return;语句完成的。

大多数其他方法包括一个返回类型,booleanfalse在出现问题时返回,或者简单地抛出一个IllegalArgumentException.

于 2014-11-03T15:48:51.357 回答
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

通过使用访问者模式,您可以走得更远并删除那些丑陋的 if

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
于 2014-11-03T15:59:20.957 回答