Effective Java Item 08
Date:
finalizer와 cleaner 사용을 피하라
finalizer란?
객체가 소멸될 때 호출하기로 약속된 메소드
자바 9에서는 deprecated 되었으며 cleaner가 도입되었다.
cleaner도 finalizer보단 다소 낫지만 되도록 사용하지 말자.
finalizer 공격을 막는 방법
1. 클래스를 final로 선언
상속을 막을 수 있다 (확장성은 포기해야 한다)
2. finalize 메소드를 final로 선언
하위 클래스에서 finalize 재사용을 막느다. 하지만 finalizer 객체가 더 오래 살아있게 된다. 무슨 말인지 정확히 이해가 안간다. finalizer 스레드가 오래 살아 있는 다는 뜻일까?
3. Boolean flag를 사용한다.
이 방법은 작성하기 번거롭고 실수하기 쉽다. 하위 클래스를 통한 공격을 막을 수도 없다.
4. 제일 좋은 방법은 객체 생성 전에 예외를 던지는 것이다.
Object가 생성될 때 JVM은 다음과 같이 동작한다.
- 객체를 위한 공간을 할당한다.
- 객체의 모든 인스턴스 변수를 기본값으로 설정. 여기에는 객체의 수퍼 클래스에 있는 인스턴스 변수가 포함된다.
- 객체에 대한 파라미터 변수를 지정한다.
- 명시적 또는 암시적 생성자 호출(생성자에서 this() 또는 super() 호출)을 처리한다.
- 클래스의 변수를 초기화한다.
- 생성자의 나머지 부분을 실행한다.
출처 - Finalizer attack
파라미터 변수를 지정할 때 예외를 던지게 해주면 된다.
참고(Reference)
Finalizer attack
Finalizer Attack in Java
댓글