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
相关产品推荐
相关产品推荐

