2014-09-15 5 views
0

나는 사회적인 그래프를 그리기 위해 gephi를 사용한다. 그러나 ProjectController 클래스를 생성하기 위해 싱글 톤을 사용한다.org.openide.util.Lookup에서 객체를 죽이는 법

@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(); 
} 

그리고 우리는 넷빈즈 API를 통해이 클래스 얻을 수 있습니다 :

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

당신은 그것을 볼 수 있습니다 당신이 싱글에서 객체를 생성이 class.When의 목록을 가지고, 그것은 목록을 추가합니다 메모리 누수가 생기고 org.openide.util.Lookup에서 객체를 죽이고 싶습니다. 어떻게하면됩니까?

+0

github의 코드 : https://github.com/geph/master/modules/ProjectAPI/src/main/java/org/gephi/project/impl/ProjectControllerImpl.java – v11

답변

1

ProjectControllerImpl 클래스의 코드에는 removeWorkspaceListener() 메서드도 포함되어 있습니다.이 메서드를 사용하면 단일 수신기는 더 이상 필요하지 않을 때 등록을 취소 할 수 있습니다 (이러한 수신기를 알고 있고 제거 할 수 있다고 가정 할 경우).

당신은 물론, 다른 방법으로 청취자를 처리하는 자신의 ProjectController 구현을 사용할 수 있습니다

    당신이 당신의 ProjectControllerImpl을하지 않으려면 WorkspaceListener의 대신 강한 참조의 WeakReference<WorkspaceListener>의 인스턴스를 저장할 수
  • 예 : WorkspaceListener가 가비지 수집되지 않도록합니다. 이는 리스너 인스턴스가 살아 있어야하는 경우 각 리스너에 대한 강력한 참조가 다른 곳에 저장되어야 함을 의미합니다.
  • 또는 ProjectControllerImplWorkspaceListener을 저장하지 말고 lookupAll()을 통해 가져옵니다. 실제로 그것을 필요로합니다.