윤개발
[ITEM8] finalizer와 cleaner 사용을 피하라 본문
자바는 두 가지 객체 소멸자인 finalizer와 cleaner를 제공한다.
finalizer는 예측할 수 없고, 상황에 따라 위험하여 쓰지 말아야한다.
또한 cleaner도 여전히 예측할 수 없고 느리며 불필요하다.
사용을 피해야 하는 이유
- 언제 실행될 지 알 수 없다.
- 성능 저하가 발생한다.
- finalize에서 발생한 예외는 무시되어 알 수 없다.
finalizer와 cleaner 를 쓰는 곳
자원 반납에 쓸 close 메소드를 클라이언트가 호출하지 않았다면 사용할 만 하다.
finalizer나 Cleaner가 호출될지 안될지 언제 호출될지도 모른지만 안하는 것 보다는 나으니 사용할 만 하다.
자바에서 제공하는 FileInputStream
, FileOutputStream
, ThreadPoolExecutor
가 대표적이다.
정리
cleaner(자바 8 까지는 finalizer)는 안전망 역할이나 중요하지 않은 자원 회수용으로만 사용하자.
물론 이 경우라도 불확실성과 성능 저하에 조심하여야 한다.
'책 내용 요약 > Effective Java 3판' 카테고리의 다른 글
[ITEM10] equals는 일반 규약을 지켜 재정의하라. (0) | 2020.04.14 |
---|---|
[ITEM9] try-finally보다는 try-with-resources를 사용하라. (0) | 2020.04.14 |
[ITEM7] 다쓴 객체 참조를 해제하라. (0) | 2020.04.14 |
[ITEM2] 생성자에 매개변수가 많다면 빌더를 고려하라. (0) | 2020.02.25 |
[ITEM1] 생성자 대신 정적 팩토리 메소드를 고려하라. (0) | 2020.02.24 |
Comments