
本文详解在 eclipse rcp 应用中动态调整“number of opened editors before closing”(即编辑器自动关闭阈值)的正确方法,指出常见错误用法,明确推荐的 api 路径,并强调内部 api 的风险与替代方案。
本文详解在 eclipse rcp 应用中动态调整“number of opened editors before closing”(即编辑器自动关闭阈值)的正确方法,指出常见错误用法,明确推荐的 api 路径,并强调内部 api 的风险与替代方案。
在 Eclipse RCP 应用开发中,开发者常希望通过编程方式控制编辑器标签页(Editor Tabs)的最大数量,以避免因打开过多编辑器导致界面臃肿或性能下降。该设置对应于 IDE 偏好页中 General → Editors → Number of opened editors before closing(默认值通常为 10),其底层作用是:当打开的编辑器数量超过设定阈值时,Eclipse 将自动关闭最久未使用的编辑器(启用“Reuse Editors”策略后生效)。
⚠️ 需要特别注意:您尝试使用的 org.eclipse.editorss.maxEditorTabs 键名并不存在(拼写错误且非标准键),而 IWorkbenchPreferenceConstants.MAX_EDITORS_FROM_MODEL 在较新版本的 Eclipse(如 4.10+)中已被移除,因此两种方式均无效。
✅ 正确的偏好键为 org.eclipse.ui.internal.IPreferenceConstants.REUSE_EDITORS —— 但请注意:该常量定义在 内部包 org.eclipse.ui.internal 中,属于非公开 API。实际生效的偏好存储位置也并非普通插件的 getPreferenceStore(),而必须使用工作台核心插件的持久化偏好存储:
import org.eclipse.ui.internal.IPreferenceConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.preferences.IWorkingCopyManager;
// ✅ 正确获取并设置(仅限启动初期或受控环境)
IPreferenceStore store = org.eclipse.ui.WorkbenchPlugin.getDefault().getPreferenceStore();
store.setValue(IPreferenceConstants.REUSE_EDITORS, 15); // 设置阈值为 15
// 强制保存到磁盘(需确保存储支持持久化)
if (store instanceof org.eclipse.core.runtime.preferences.IEclipsePreferences) {
try {
store.save();
} catch (Exception e) {
Activator.logError("Failed to save editor reuse preference", e);
}
}? 关键说明:
- REUSE_EDITORS 实际控制的是“触发编辑器复用/关闭的阈值”,而非单纯显示数量;它与 org.eclipse.ui.internal.IPreferenceConstants.EDITOR_REUSE_THRESHOLD(内部整型键)协同工作,但后者更不建议直接操作。
- WorkbenchPlugin.getDefault().getPreferenceStore() 是唯一能影响全局编辑器行为的偏好存储实例,插件自身的 getPreferenceStore() 对此无效。
- 所有 org.eclipse.ui.internal.* 类型均为 Eclipse 内部实现细节,官方明确标记为 @noextend @noinstantiate @noimplement,不保证向后兼容。在产品级 RCP 应用中直接调用可能导致升级失败或运行时异常。
? 推荐实践方案(生产环境):
- 优先通过用户偏好配置:在 plugin.xml 中声明 org.eclipse.ui.preferencePages 扩展,继承 IDEEditorsPreferencePage(需依赖 org.eclipse.ui.ide),提供自定义偏好页引导用户设置;
- 启动时预设(谨慎使用):若必须代码初始化,应在 WorkbenchAdvisor#preStartup() 或 EarlyStartUpHandler 中执行,并添加版本兼容性检查(例如反射检测类是否存在);
- 替代 UX 策略:考虑禁用自动关闭逻辑(设为 Integer.MAX_VALUE),转而提供“Close Others”、“Close All” 快捷操作或标签页分组管理功能,提升可控性与用户体验。
总之,虽然技术上可通过内部 API 修改该值,但应将其视为临时调试手段。构建健壮、可维护的 RCP 应用,始终应遵循 Eclipse 平台的扩展点契约,避免对内部实现产生强依赖。










