본문 바로가기
공부/이펙티브자바

[이펙티브자바]item 19.상속을 고려해 설계하고 문서화하라.그러지 않았다면 상속을 금지하라.

by 띵커베르 2023. 2. 3.
728x90
  • 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다.
    • 재정의? => public과 protected 메서드 중 final 이 아닌 모든 메서드를 뜻함
  • @impleSpec 어노테이션으로 자바독을 만들 수 있다.
  • API 의 문서를 만들때는 "어떻게"가 아닌 "무엇"을 하는지 설명하는거에 대비하여 상속을 위한 내부클래스의 문서화는 상당히 내부구조까지 설명을 해야한다. 이는 캡슐화가 이미 깨졌고 내부 구현을 모르면 오작동의 위험이 있기 때문이다.
  • 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅을 잘 선별하여 protected 메서드 형태로 공개해야 할 수도 있다.
    • 어떤 클래스를 protected 로 노출해야할지 결정하는 방법은 직접 하위 클래스를 3개 정도 만들어 보되, 하나 이상은 제 3자가 만들어 보는게 좋다.
    • 상속용으로 설계한 클래스는 배포 전에 반드시 하위 클래스를 검증해야 한다.
  • 상속용 클래스의 생성자는 직접적으로든 간접적으로든 재정의 가능 메서드를 호출해서는 안 된다.
    • 이는 슈퍼클래스의 메서드를 서브클래스에서 오버라이드하여 사용할 경우 하위클래스가 호출되면서 슈퍼클래스의 생성자가 호출되고, 오버라이드한 하위 메서드가 호출되고 null 등 원하지 않은 결과를 반환할 수 있다.
  • 마찬가지로 Cloneable 과 Serializer 인터페이스는 상속용 받아 사용할때도 재정의 하지 않는다.
  • 그냥 가장 좋은 방법은 상속용으로 설계하지 않은 클래스는 상속을 금지하는 것이다
728x90

댓글