gpt4 book ai didi

java - 如何杀死 org.openide.util.Lookup 中的对象

转载 作者:行者123 更新时间:2023-12-01 12:32:21 26 4
gpt4 key购买 nike

我使用gephi来绘制社交图。但是,它使用单例来创建类ProjectController。

@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 api获取这个类:

ProjectController pc = Lookup.getDefault().lookup(ProjectController.class);

你可以看到这个类中有一个List。当你从这个单例创建一个对象时,它会添加这个列表。它会造成内存泄漏,我想杀死org.openide.util.Lookup中的对象,如何我可以做什么吗?

最佳答案

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

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

  • 您可以存储 WeakReference<WorkspaceListener> 的实例而不是对 WorkspaceListener 的强烈引用如果您不想要 ProjectControllerImpl实例以防止WorkspaceListener s 被垃圾收集。 (这意味着只要监听器实例存在,就需要将对每个监听器的强引用存储在其他位置。)
  • 或者,不要存储 WorkspaceListener在你的 ProjectControllerImpl 中根本没有,但可以通过 lookupAll() 获取它们当你真正需要它们时。

关于java - 如何杀死 org.openide.util.Lookup 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25842033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com