문제

특정 객체에 대한 마지막 참조가 해제 될 때 정확히 호출 될 핸들러를 등록하는 방법이 있습니까?

예를 들어 실제 데이터 파일에 의해 뒷받침되는 객체가 있으며 일단 개체가 참조되지 않으면 파일이 닫히고 이름이 바뀌어야합니다. 해당 객체에서 "닫기"메소드를 명시 적으로 호출하지 않고도 가능하다면 좋을 것입니다.

약한/팬텀 참조 영역에서 내가 알고있는 모든 알림 메커니즘은 어느 시점에서 알림이 발생할 것이지만 이것이 언제 일어날 지에 대한 구랑권이 없다고 명시합니다.

도움이 되었습니까?

해결책

요컨대, 아니요.

Java 사양은 마지막 참조가 언제 출시 될지 알 수있는 능력을 명시 적으로 거부합니다. JVM 구현 (및 최적화)은 이에 따라 다릅니다. 후크가 없습니다.

다른 팁

내 이해에서, 나는 잠수한 물체에 대한 "파괴자"를 찾기 위해 시간을 보았을 때, 마지막 참조를 잃는시기를 알 수있는 방법이 없습니다. Java는 객체에 대한 참조를 추적하지만 성능의 이유로이 정보는 쓰레기 수집 중에 만 업데이트됩니다.

가장 가까운 것은 쓰레기 수집 중에 호출되어야하는 최종 방법이지만 그때까지도 호출 될 것이라는 보장은 없습니다.

약한 회의가 당신이 원하는 일을한다고 생각합니다. 약한 참조가 약하게 도달 할 수있게 되 자마자 약점이 참조에 들어갑니다 (즉, 모든 강력한 참조가 사라집니다).

이 기사를 참조하십시오 에단 니콜라스.

종료시 참조 큐에 도달하지 않는 일부 참조가 걱정 된 경우 생성 된 모든 개체 목록을 유지하십시오 (약점 또는 공연 반복 사용). 미결제 참조가 목록을 확인하는 셧다운 후크를 추가하고 필요한 작업을 수행하십시오.

문제는 "물체에 대한 언급을 유지하지 않고 어떻게 이것을 구현합니까?"입니다.

해당 문제를 통과 할 수 있더라도 서비스를 통해 핸들 맨거에게 전화 할 수 있다고 말하면 핸들 맨거는 핸들러에게 새로운 참조를 만들어 핸들러에게 전달해야합니다. 그런 다음 핸들러가 (a) 참조를 저장할 수 있습니다. 또는 (b) 참조를 해제합니다. 즉, 최종 참조가 다시 한 번 릴리스되었음을 의미합니다. 즉, 핸들러가 다시 호출되어야합니다 ....

파일과 같은 외부 리소스를 관리 해야하는 경우 Java에서 최선을 다하면 Close () 함수 (선택한 이름이든)입니다. Finalize ()를 "벨트 및 멜빵"보험 정책으로 사용할 수 있지만 예측할 수없는 타이밍이 있습니다. 따라서 주요 방어선은 Close () 기능이어야합니다.

내 대답을 참조하십시오 Finalize ()를 구현 한 이유는 무엇입니까?

이것은 Java로 수행 할 수 없습니다. 제가 말할 수있는 한 참조 카운팅 쓰레기 수집기가 필요합니다. 객체의 수명을 유지하기보다는 객체의 물리적 데이터 파일을 필요에 따라 열고 닫는 것을 고려 했습니까?

~할 수 있었다 우세하다 finalize() 당신의 대상에서는 다른 사람들이 언급 한 이유로 문제가됩니다.

구체적인 예를 들어, 당신은 같은 것을 사용하는 것을 볼 수 있습니다. File.deleteOnExit(), VM이 종료되면 파일을 제거합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top