2011-08-02 3 views
10

Java의 우아한 방법으로 모든 기존 객체 포인터를 null으로 설정 하시겠습니까? 개체를 삭제하고 싶지만 여러 위치에 이벤트 수신기가 등록되어 있습니다.Java에서 모든 객체 포인터를 삭제하는 방법

+1

왜 이벤트 리스너를 삭제하지 않습니까? – emory

+0

예, 가능한 한 가지 해결책은 객체가 삭제되었을 때 이지만 [WeakReferences] (http://download.oracle.com/javase/1,5.0/docs/api/java)를 사용하여 모든 EventListeners에서 모든 참조를 삭제하는 것입니다. Object가 null로 설정되었을 때 스스로 파괴 할 것이므로 – Skip

답변

6

References을 살펴볼 수 있습니다. 참조를 사용하여 클래스를 참조하면 모든 일반 참조가 제거 될 때 오브젝트가 가비지 수집되지 않습니다. Reference 클래스가 보유한 참조는 수집기가 수집 할 개체를 결정할 때 계산되지 않습니다. 물론 청취자는 갑자기 사라지는 참조를 올바르게 처리해야합니다. 그리고 당신은 당신이 주위에 달라 붙는 것을 필요로하는 한 무엇인가가 일정한 참조를 유지하고 있는지 확인해야 할 것입니다.

이 스레드에서 약한 참조와 약한 참조의 차이점을 확인하십시오. What is the difference between a soft reference and a weak reference in Java?

+0

참조는 모든 참조 클래스의 일반적인 상위 유형입니다. WeakReferences를 의미한다고 생각합니까? – berry120

+0

일반적으로 그렇지만 다른 두 가지를 사용해야하는 이유가 있습니다. – sblundy

+0

전적으로 동의합니다.이 질문의 맥락에서 WeakReference가 가장 적절하다고 생각합니다! – berry120

1

Java의 경우 참조를 통해이를 수행 할 수 없습니다. 결정 성있는 Dispose 메서드를 만들어서 .NET의 IDisposable과 같은 참조에서 값을 비울 수 있습니다.

4

명시 적으로, 아니요. 그리고 거기에는 좋은 이유가 있습니다. Java에서 가비지 콜렉션이 작동하는 방식이 아닙니다!

내가 실제로 생각할 수있는 최선의 접근 방법은 잠재적으로 WeakReferences에서 객체에 대한 모든 참조를 마무리하는 것입니다. , 주위에있는 사람들을 지나쳐서, 당신의 물건에 대한 강한 참고를 붙잡아 라. 이 강력한 참조를 null로 설정하면 해당 객체에 대한 모든 약한 참조가 가비지 수집 대상이됩니다.

물론 하드 참조가 null로 설정되면 WeakReference는 이후 언제든지 임의로 사라질 수 있다는 점을 알아야합니다. 따라서 코드를 사용하는 모든 코드가이를 처리 할 준비가되었는지 확인해야합니다.

그렇긴하지만 그 경로는 거의 다운되지 않는 것이 가장 좋으며, 유지 관리하기가 훨씬 더 어렵습니다. 범위를 벗어날 때 모두 릴리스된다는 것을 보장하는 것이 훨씬 더 나은 대안이 될 것이고 나머지 코드가 깔끔 해지면 어렵지 않을 것입니다.

7

우아한 방법은 없습니다. 그렇게하지 않거나 코드를 유지하기 어렵게 될 것입니다.

2

몇 가지 참고 사항 :

  1. 당신은 자바 객체 삭제를 제어 할 수 없습니다. 이것은 가비지 수집기의 일입니다. GC가 가비지 콜렉션을 수행하도록 지시 할 수 있지만, 이것이 오브젝트가 사실 삭제되는 것을 보장하지는 않습니다.

  2. 실제적으로 더 이상 도달 할 수없는 개체는 삭제됩니다. 모든 참조를 삭제하면 더 이상 접근 할 수 없습니다.

+0

그 이유는 내가 모든 개체 참조를 삭제하는 방법을 요청했습니다. – Skip

+0

글쎄 그럴 수 없어 - 기본적으로 내 대답이야. 필요한 경우 객체의 참조를 검색하는 래퍼 클래스를 만들 수 있지만이 래퍼를 사용하는 코드가 참조를 내부적으로 저장하지 않도록해야합니다. –

관련 문제