You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何修复返回的ViewEntry被回收问题?需返回最后匹配条目

解决ViewEntry被回收导致返回失效的问题

原代码的核心问题是:循环内无论checkEntry是否为匹配项,都会被调用recycle()回收,而matchEntry只是对某个checkEntry的引用,当该checkEntry被回收后,matchEntry就会变成无效对象,无法正常使用。

修复方案

核心思路是只回收不需要保留的ViewEntry:每次找到新的匹配条目时,回收之前的旧匹配条目;不匹配的条目处理后立即回收;最后一个匹配条目保留不回收,作为返回值返回。

修改后的代码:

public ViewEntry getStdTime(DateTime input, String key) {
    ViewEntryCollection checkColl = v.getAllEntriesByKey(key, true);
    ViewEntry checkEntry;
    ViewEntry checkTmpEntry = null;
    ViewEntry matchEntry = null;

    checkEntry = checkColl.getFirstEntry();
    while (checkEntry != null) {
        String xStartDate = checkEntry.getColumnValues().get(2);
        DateTime dtx = session.createDateTime(xStartDate);
        boolean isMatch = dtx.toJavaDate().compareTo(input.toJavaDate()) <= 0;
        
        if (isMatch) {
            // 回收之前的匹配条目,避免资源泄漏
            if (matchEntry != null) {
                matchEntry.recycle();
            }
            // 更新为当前匹配条目,暂时不回收
            matchEntry = checkEntry;
        }
        
        // 必须先获取下一个条目,再回收当前条目(getNextEntry依赖当前条目有效性)
        checkTmpEntry = checkColl.getNextEntry(checkEntry);
        
        // 非匹配条目直接回收
        if (!isMatch) {
            checkEntry.recycle();
        }
        
        checkEntry = checkTmpEntry;
    }
    return matchEntry;
}

注意事项

  • 返回的matchEntry在调用方使用完毕后,必须手动调用matchEntry.recycle(),避免Domino资源泄漏。
  • 该方案完全基于Domino API的资源回收规则调整逻辑,无需使用clone()或newInstance()方法。

内容的提问来源于stack exchange,提问作者Thomas Adrian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:35:30