1

どのメソッドがセカンダリ メソッドを呼び出したかを確認する if ステートメントを作成したいと考えています。

私が何を意味するかを理解できるように、私が望むものを疑似コードで書きます。

public static void methodOne() {
    methodToCall();
    }

public static void methodTwo() {
    methodToCall();
    }

public static void methodThree() {
    methodToCall();
    }

public static void methodToCall() {
    if (methodOne made the call == true) {
        execute this
    } else if (methodTwo made the call == true){
        execute this
    } else if (methodThree made the call == true){
        execute this
    } else {
        System.out.println("How did you get here?");
    }
}

要旨は以上です。呼び出しに関連する操作を選択できるように、どのメソッドが呼び出しを行ったかを確認する簡単なチェックが必要です。

これは可能ですか?

不可能な場合、回避策はありますか?

4

5 に答える 5

4

3 つの短いメソッドのロジックを 1 つの大きなメソッドに結合するのではなく、3 つの短いメソッドを使用します。短いメソッドが作成されたら、各呼び出しメソッドから適切なメソッドを呼び出すだけです。

public static void methodOne() {
    methodToCall1();
}

public static void methodTwo() {
    methodToCall2();
}

public static void methodThree() {
    methodToCall3();
}

public static void methodToCall1() {
    int x = 0;
    x = x - 3; //some custom logic to prep argument
    commonLogic(x);
}

public static void methodToCall2() {
    //Method 2 logic
    int x = 0;
    x = x + 3; //some custom logic to prep argument
    commonLogic(x);
}

public static void methodToCall3() {
    //Method 3 logic
    int x = 0;
    x = x * 3; //some custom logic to prep argument
    commonLogic(x);
}

public static void commonLogic(int arg1){
     //peform common logic
}

これら 3 つのメソッドに重複するコードが含まれる場合は、重複するコードを別のメソッドに抽象化し、そのメソッドをそれぞれの小さなメソッド内から呼び出します。アイデアは、3 つの小さな関数のそれぞれで共通関数を呼び出すための引数を準備し、次にそれらの引数を使用して共通関数を呼び出すことです。

于 2013-09-29T10:16:55.750 に答える
2

次の方法でコールスタックを調べることで実行できますThread.getStackTrace()

public static void methodToCall(Action action) {
    String callingMethod = Thread.currentThread().getStackTrace()[2].getMethodName();
    if (callingMethod.equals("methodOne")) {
        execute this0
    } else if (callingMethod.equals("methodTwo")) {
        execute this
    } else if (callingMethod.equals("methodThree")) {
        execute this
    } else {
        System.out.println("How did you get here?");
    }
}

しかし、そうすべきではありません。これは少しアンチ OO です。代わりに、メソッド シグネチャを次のように変更します。

public enum Action {ONE, TWO, THREE}

public static void methodToCall(Action action) {
    if (action == ONE) {
        execute this
    } else if (action == TWO) {
        execute this
    } else if (action == THREE) {
        execute this
    } else {
        System.out.println("How did you get here?");
    }
}
于 2013-09-29T10:40:40.030 に答える
1

列挙型を使用することになった場合は、Java の列挙型がクラスのシングルトン インスタンスに劣らないという事実を必ず利用してください。したがって、列挙型のコンテキスト外で定義されたメソッドに列挙型をパラメーターとして渡す代わりに、列挙型定義でメソッドを抽象として宣言し、各インスタンスでオーバーライドすることができます。

したがって、次のようになります。

enum Method {

    Mode1 {
            @Override
            void call() {
                    // do stuff 
            }
    }, Mode2 {
            @Override
            void call() {
                    // do stuff differently
            }
    }, Mode3 {
            @Override
            void call() {
                    // do stuff even more differently
            }
    };

    abstract void call();
}

そして、ラッピングメソッドが必要ないか、それ以上のことをする必要がある場合は、次のように記述します。

public static void methodOne() {
    // some code
    Method.Mode1.call();
    // some code
}
于 2013-09-29T12:40:01.293 に答える