Search

Item 88. readObject 메서드는 방어적으로 작성하라

생성일
2023/08/24 08:54
챕터
12장 - 직렬화

요약

readObject는 방어적 복사와 매개변수 유효성 검사를 통해 방어적으로 사용하자.

readObject는 방어적으로 사용하기

readObject 메서드는 실질적으로 또다른 public 생성자이기 때문에, 불변식을 깨지 못하도록 다른 생성자와 똑같은 수준으로 주의를 기울여야 한다.
매개변수로 받은 인수가 유효한지 검사해야 한다.
필요하다면 매개변수를 방어적으로 복사해서 사용해야 한다.
객체를 역직렬화할 때는 클라이언트가 소유해서는 안되는 객체 참조를 갖는 필드는 반드시 모두 방어적으로 복사해야 한다.
readObject에서는 불변 클래스 안의 모든 private 가변 요소를 방어적으로 복사해서 사용해야 한다.
방어적 복사를 유효성 검사보다 앞서 수행해야 한다.
final 한정자를 사용하면 방어적 복사가 불가능하니, final 필드를 직렬화해야 한다면 final을 제거하고 사용하자.
위 방법들을 적용하고 싶지 않다면, 직렬화 프록시 패턴을 사용하자.
final이 아닌 직렬화 클래스는 readObject 메서드가 재정의 가능한 메서드를 호출해서는 안된다.
하위 클래스가 완전히 역직렬화가 되기 전에 하위 클래스에서 재정의된 메서드가 실행되어 오작동이 발생한다.