베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • 스프링
    • java
    • 자바8
    • dfs
    • 스레드
    • Spring
    • 이펙티브자바
    • 운영체제
    • 데이터베이스
    • 함수형인터페이스
    • jpa
    • 코드업
    • leetcode
    • 토비스프링
    • 자바
    • C++
    • BFS
    • 알고리즘
    • 백준
    • 스프링시큐리티

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    개발서적/Effective Java

    [Effective Java] 상속을 고려해 설계하고 문서화하라

    2023. 5. 25. 01:38

    상속용 클래스는 내부 구현을 문서로 남겨야 한다.

    '외부' 클래스를 사용한다는 것은 프로그래머에게 통제권이 없어 언제 어떻게 변경될지 모른다는 의미를 갖는다. 따라서 상속용 클래스를 만들 때는 메서드를 재정의하면 어떤 일이 일어나는지 정확히 정리하여 문서로 남겨야 한다. (public, protected 메서드 중 final이 아닌 모든 메서드)
        => 어떤 순서로 호출하는지, 각각의 호출 결과가 이어지는 처리에 어떤 영향을 주는지 등

    Implementation Requirements

    • API 문서의 메서드 설명에 있는 문구로, 메서드의 내부 동작 방식을 설명하는 곳이다.
    • @implSpec태그를 붙여주면 자바독 도구가 생성해준다.

    주의

    1. 상속용 클래스의 생성자는 어떤 방식으로든 재정의 가능 메서드를 호출하면 안된다.
    public class Super {
        public Super() {
            overrideeMe();
        }
    
        public void overrideeMe();
    }
    
    public final class Sub extends Super {
        private final Instant instant;
    
        Sub() {
            instant = Instant.now();
        }
    
        @Override public void overrideMe() {
            System.out.println(instant);
        }
    
        public static void main(String[] args) {
            Sub sub = new Sub();
            sub.overrideMe();
        }
    }

    여기서 instant가 두 번 출력되어야 할 것 같지만 한 번은 null이 찍힌다. 상위 클래스의 생성자는 하위 클래스의 생성자가 인스턴스 필드를 초기화하기도 전에 overrideMe를 호출하기 때문이다.

    저작자표시 비영리 변경금지 (새창열림)
      '개발서적/Effective Java' 카테고리의 다른 글
      • [Effective Java] 인터페이스는 구현하는 쪽을 생각해 설계하라
      • [Effective Java] 추상 클래스보다 인터페이스를 우선하라
      • [Effective Java] 상속보다는 컴포지션을 사용하라
      • [Effective Java] 변경 가능성을 최소화하라
      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바