重要: 例が間違っています。理由を最後に説明します
タイトルが述べたように、質問は、現在実行中のメソッドが再帰的に呼び出されるタイミングを決定する方法を定義しようとしています。
呼び出し元メソッド (これは、「クエリ メソッド」を呼び出すメソッド) が既に呼び出されているかどうかを示すブール値を返す「クエリ メソッド」を持つことを考えています。
それを確認する方法:スタック トレースを覗いて、チェックしたいメソッドがスタック トレースで2 回以上表示されているかどうかを確認します。
それを説明した後、メソッドの実装とそのそれぞれの使用法を次に示します。
これは正しくありません...
public class Test
{
public static boolean isRecusivelyInvoqued () {
StackTraceElement[] traces = Thread.currentThread().getStackTrace();
boolean res = false;
// the first belong to "getStackTrace" and the second to "isRecusivelyInvoqued" (this method)
if (traces.length > 2) {
String invokedMethodName = traces[2].getMethodName(); // the third is the method we want to check
for (int i = 3; i < traces.length && !res; i++)
{
res = invokedMethodName.equals(traces[i].getMethodName());
i++;
}
}
return res;
}
// this is a recursive method, used to verify the correct functioning
public static int factorial (int n) {
System.out.println(isRecusivelyInvoqued());
if (n == 0) {
return 1;
}
else {
return n * factorial(n-1);
}
}
public static void main(String[] args)
{
System.out.println(factorial(4));
}
}
異なる名前空間 (クラスまたはインスタンス) のメソッドが同じ名前を持つ場合、それは呼び出された再帰的に返されます。ここまでで得た解決策の 1 つは、それが正しいということです ;) うわあ。
これは私にとってはうまくいっています...私の目標をアーカイブするためのより良い方法はありますか? 現在実行中のメソッドがいつ再帰的に呼び出されるかを判断する方法は?