我正在扩展第 3 方类并覆盖我已“递归”的方法,如下所示:
public class SubFoo extends Foo {
....
@Override
public void bar(...) {
recursiveSpecificSet.add(...);
if(recursiveSpecificSet.contains(...)){
...
methodCallThatCallsBar(...);
...
}
}
}
由于此方法被重写,我无法控制方法签名。我想通过 recursiveSpecificSet 将父级递归调用的信息传递给其子级,但我希望该信息特定于该递归链。例如:
SubFoo sf = new SubFoo();
sf.methodCallThatCallsBar(...); // first call calls bar recursively 3 times
sf.methodCallThatCallsBar(...); // second call calls bar recursively 5 times
在上面的代码中,第一次调用的 recursiveSpecificSet 变量不应干扰第二次调用的 recursiveSpecificSet。
这可能吗?我知道您通常可以通过方法参数在递归迭代之间传递信息,但我无法控制方法签名。对 bar 方法的多次调用也可以发生在同一个线程中,因此线程局部变量将不起作用。
最佳答案
使用存储递归深度和有效负载数据的线程本地。如果进入 bar()
时,threadlocal 为 null,则使用深度 1 对其进行初始化,否则增加深度。离开 bar()
时,减少深度,如果深度低于 1
,则删除 threadlocal。您可能必须在finally中执行此操作,这样在抛出异常时它才不会中断。
public void bar() {
if (threadLocal == null) {
threadLocal.set(new Context(recursiveSpecificSet));
}
threadLocal.get().increaseDepth();
try {
...
methodCallThatCallsBar(...);
...
}
finally {
threadLocal.get().decreaseDepth();
if (threadLocal.get().isExitRecursion()) {
threadLocal.remove();
}
}
}
关于java - 通过多次递归调用持久保存信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33522624/