gpt4 book ai didi

java - 通过多次递归调用持久保存信息

转载 作者:行者123 更新时间:2023-11-30 03:11:34 24 4
gpt4 key购买 nike

我正在扩展第 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com