首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在org.openide.util.Lookup中杀死对象

如何在org.openide.util.Lookup中杀死对象
EN

Stack Overflow用户
提问于 2014-09-15 06:28:59
回答 1查看 64关注 0票数 0

我使用gephi绘制社会graph.But,它使用singleton创建类ProjectController。

代码语言:javascript
复制
@ServiceProvider(service = ProjectController.class)
public class ProjectControllerImpl implements ProjectController {

private enum EventType {

    INITIALIZE, SELECT, UNSELECT, CLOSE, DISABLE
};
//Data
private final ProjectsImpl projects = new ProjectsImpl();
private final List<WorkspaceListener> listeners;
private WorkspaceImpl temporaryOpeningWorkspace;

public ProjectControllerImpl() {

    //Listeners
    listeners = new ArrayList<WorkspaceListener>();
    listeners.addAll(Lookup.getDefault().lookupAll(WorkspaceListener.class));

    registerNetbeansPropertyEditors();
}

我们可以通过netbeans获得这个类:

代码语言:javascript
复制
ProjectController pc = Lookup.getDefault().lookup(ProjectController.class);

您可以看到它在这个class.When中有一个列表,您可以从这个单例创建一个对象,它会添加list.It使内存泄漏,我想在org.openide.util.Lookup中杀死这个对象,我该怎么办?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-15 08:20:08

您链接到的ProjectControllerImpl类的代码还包含一个方法removeWorkspaceListener(),您可以使用该方法在不再需要单个侦听器时注销它们(假设您了解这些侦听器,并且可以删除它们)。

当然,您可以使用自己的ProjectController实现以不同的方式处理侦听器:

  • 如果不希望WeakReference<WorkspaceListener>实例阻止垃圾收集,则可以存储ProjectControllerImpl实例而不是对WorkspaceListener的强引用。(这意味着,只要侦听器实例存在,对每个侦听器的强引用就需要存储在其他地方。)
  • 或者,不要将WorkspaceListener存储在ProjectControllerImpl中,而是在实际需要时通过lookupAll()获取它们。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25842033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档