2

void メソッドを呼び出すことで「キャンセル」されたかどうかを確認できるかどうかを尋ねたいだけですreturn;

たとえば、私のメインcalculate(myArray);では、次のように定義されているを呼び出します。

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

それが戻ってきたかどうかを知る方法はありますか?私の考えは、戻る直前に真に変更される「グローバル」ブール値を作成し、メインでその値を確認するか、戻り値の型を int のようなものに変更し、それが返されたときに最初return -1;と最後に使用することでした方法return 0;

どちらも可能ですが、どちらもあまり良いスタイルではないと思います。代替手段はありますか?

4

3 に答える 3

5

あなたが説明したプラクティスが Java (およびその他の最新の言語) で悪いと見なされていることは正しいです。

シナリオで最も一般的に受け入れられるプラクティスは次のとおりです。

  • メソッドが例外をスローするようにします。通常の状況で「失敗した」コード パスが発生しない場合は、これを行います。
  • bool成功または失敗を示すメソッドの戻り値の型を作成します。「失敗した」コード パスが通常の状況でも発生する可能性がある場合は、これを実行します。
于 2014-11-03T15:45:58.710 に答える
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 に答える