Вы можете посчитать количество вызовов, не передавая новый параметр методу recur
.
recursiveMethodCount
фильтрует текущую трассировку стека и подсчитывает вхождения.
import java.util.Arrays;
public class StackTrace {
public static void main(String[] args) {
recur();
}
public static void recur() {
long recursionLevel = recursiveMethodCount("StackTrace", "recur");
if (recursionLevel < 10) {
System.out.println(String.format("Recursion level is %d, invoking recur() again.", recursionLevel));
recur();
} else {
System.out.println(String.format("Recursion level is %d, no more invocations.", recursionLevel));
}
System.out.println(String.format("Recursion level is %d, returning.", recursionLevel));
}
public static long recursiveMethodCount(String declaringClass, String methodName) {
return Arrays.stream(Thread.currentThread().getStackTrace())
.filter(stackTraceElement -> stackTraceElement.getClassName().equals(declaringClass))
.filter(stackTraceElement -> stackTraceElement.getMethodName().equals(methodName))
.count();
}
}
Выход этого кода
Recursion level is 1, invoking recur() again.
Recursion level is 2, invoking recur() again.
Recursion level is 3, invoking recur() again.
Recursion level is 4, invoking recur() again.
Recursion level is 5, invoking recur() again.
Recursion level is 6, invoking recur() again.
Recursion level is 7, invoking recur() again.
Recursion level is 8, invoking recur() again.
Recursion level is 9, invoking recur() again.
Recursion level is 10, no more invocations.
Recursion level is 10, returning.
Recursion level is 9, returning.
Recursion level is 8, returning.
Recursion level is 7, returning.
Recursion level is 6, returning.
Recursion level is 5, returning.
Recursion level is 4, returning.
Recursion level is 3, returning.
Recursion level is 2, returning.
Recursion level is 1, returning.