IT/Programming / / 2023. 4. 25. 15:46

<Effective Java> RULE 76 readObject메서드는 방어적으로 구현하라

반응형

readObject?

readObject 메소드는 대응하는 writeObject 메소드에 의해 스트림에 기입해진 데이터를 사용해, 그 특정의 클래스의 오브젝트의 상태를 읽어 복원합니다. 이 메소드는 슈퍼 클래스 또는 서브 클래스에 속하는 상태와 관련 될 필요가 없습니다. 상태는 개별 필드의 ObjectInputStream에서 데이터를 읽고 객체의 해당 필드에 할당하여 복원됩니다. 원시적 데이터 형의 read는, DataInput에 의해 서포트됩니다. (https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html)

즉, 객체를 읽어 옵니다.

 

readObject메서드를 구현하고자 할 때 따라야 하는 지침

· private로 남아 있어야 하는 개체 참조 필드를 가진 클래스는 그런 필드가 가리키는 개체를 방어적으로 복사해야한다.

ㄴ 변경 불가능 클래스의 변경 가능 컴포넌트가 이 범주에 해당한다.

· 불변식을 검사해서 위반된 사실이 감지될 경우 InvalidObjectException을던져라.

ㄴ 불변식 검사는 방어적 복사 이후에 시행해야 한다.

· 만일 개체를 완전히 역직렬화 한 다음에 전체 객체 그래프의 유효성을 검사해야 한다면 ObjectInputValidation인터페이스를 이용하라.

· 직접적이건 간접적이건, 재정의 가능 메서드를 호출하지 마라.

 

결론

· 객체를 역으로 직렬화 할 때는 클라이언트가 가질 수 없어야 하는 개체참조를 담은 모든 필드를 방어적으로 복사하도록 해야 한다.

· writeUnshared와 readUnshared메서드는 사용하지 마라. 안전성을 제공하지 못한다.

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유