2012-09-17 3 views
2

내 응용 프로그램에 대한 인터셉터를 구현하려고했는데, 그 객체는 본 객체를 추적 할 수 있습니다. 나는 지금 볼 수있는 대상이 새로운 것인지 재사용 된 것인지를 말할 수 있어야합니다.이미 본 객체를 계속 추적합니다.

public interface Interceptor { 
    void process(Object o); 
} 

내가 그 객체를 추적 할 것 세트를 추가하는 방법에 대해 생각을 해 봤는데 :

나는 이와 같은 인터페이스는 한 가정. 하지만 그런 종류의 행동으로 메모리 누출을 일으키고 싶지 않기 때문에 아마도 다른 패턴을 고안해야할까요? 결국, 그 물체는 다른 층에서 파괴 될 수 있습니다.

가능한 해결책이 보인다 :

  • 는 HashSet의 대신 WeakHashSet를 사용하여 설정
  • 에 객체의 해시 코드를 넣어

첫 번째 옵션은 100 % 신뢰할 수있는 것, 해시 코드가되지 않을 수 있기 때문에 독특한. 두 번째 옵션에 관해서는, 이것이 memleak을 막을 수 있을지 확신하지 못합니다.

또 하나의 메모는 개체를 수정할 수 없으며 입력란을 추가 할 수 없습니다. 줄 바꿈도 옵션이 아닙니다.

아이디어가 있으십니까?

답변

5

WeakReferences입니다. here에서 :

약한 참조, 간단히 말해, 메모리에 남아있는 개체를 강제로 충분히 강하지 않은 참조입니다. 약한 참조를 사용하면 은 에 대한 연결 가능성을 판단 할 수있는 가비지 수집기의 기능을 활용하므로 직접 처리하지 않아도됩니다.

즉, WeakReference을 유지하면 강제로 JVM이이 객체에 대한 참조를 보유하지 않습니다. 당신이 찾을 수 있도록 물론

약한 참조 weakWidget.get()가 갑자기 null을 반환 시작하도록합니다 ( 위젯에 더 강한 참조가없는 경우), 쓰레기를 수집을 방지하기 위해 충분히 강하지 않다.

+0

위 참조. get() 메소드는 null을 줄 것이다. –

1

Brian Agnew 정답으로 완료됩니다. 자바 API에는 WeakHashSet 클래스가 없습니다, 당신은이 같은 WeakHashMap에서 만들어야합니다 :

Set<Object> weakHashSet = Collections.newSetFromMap(
     new WeakHashMap<Object, Boolean>()); 

Collections.newSetFromMap 자바 문서를 참조하십시오.

관련 문제