본문 바로가기

이펙티브 자바

[이펙티브 자바] 아이템 8. finalizer와 cleaner 사용을 피하라

자바는 두 가지 객체 소멸자를 제공한다.

finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다.

cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다.

사용 예시 : 

public class ProblematicResourceHolder {
    private SomeResource resource;

    public ProblematicResourceHolder(String resourceName) {
        this.resource = new SomeResource(resourceName);
    }

    // Finalizer를 사용한 자원 해제 시도 - 사용을 피해야 함!
    @Override
    protected void finalize() throws Throwable {
        try {
            if (resource != null) {
                resource.release(); // 자원 해제 시도
            }
        } finally {
            super.finalize();
        }
    }
}

finalizer를 사용하는 간단한 예시 이다.

안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 finalizer 혹은 cleaner를 사용하는게 좋다.

하지만 그냥 둘다 사용 자체를 하지않는게 좋은것 같다.

 

 

 

결론 : finalizer, cleaner 둘다 사용하지말자