簡體   English   中英

通過多個遞歸調用持久化信息

[英]persisting information through multiple recursive calls

我正在擴展一個3rd party類,並且覆蓋了像這樣使“遞歸”的方法:

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遞歸,而是使bar調用遞歸的私有幫助器方法。

@Override
public void bar() {
    helper(new HashSet<>());
}

private void helper(Set<String> recursiveSpecificSet) {
    ...
    helper(recursiveSpecificSet);
    ...
}

使用線程本地存儲遞歸深度和有效負載數據。 如果在輸入bar() threadlocal為null,則以深度1對其進行初始化,否則以depth遞增。 離開bar() ,遞減深度,如果深度小於1 ,則刪除threadlocal。 您可能最終必須這樣做,以便在引發異常的情況下它不會中斷。

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();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM