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

标签 java recursion overriding

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

相关文章:

java - 使用页面工厂处理分页

java - Java中的 "the result to the type expected by the invoker"是什么?

java - 计算并删除字符串列表中的重复项,但将重复项添加到键中(任何惯用的 java8 式方式?)

java - 如何在派生类中覆盖 `toString` 并使用基类中的私有(private)实例变量?

c++ - 关于C++中的虚函数覆盖

java - 使用 jquery 打开新窗口

java - 递归和返回关键字

python pickler - 超出递归深度

c - 在递归函数中打印函数参数

Java方法重写协方差查询