Возможно, вы уже знаете это, но эта функция не так тривиальна, как может показаться, поскольку язык Java фактически предоставляет трассировку стека программисту.
Рассмотрим следующую программу:
public class Test {
public static String f() {
String s = Math.random() > .5 ? f() : g();
return s;
}
public static String g() {
if (Math.random() > .9) {
StackTraceElement[] ste = new Throwable().getStackTrace();
return ste[ste.length / 2].getMethodName();
}
return f();
}
public static void main(String[] args) {
System.out.println(f());
}
}
Даже при том, что это имеет "хвостовой вызов", это не может быть оптимизировано. (Если он оптимизирован , он все равно требует учета всего стека вызовов, поскольку семантика программы зависит от него.)
По сути, это означает, что это трудно поддерживать, хотя и обратно совместимо.