public class Super {
// 잘못된 예 - 생성자가 재정의 가능 메서드를 호출한다.
public Super() {
overrideMe();
}
public void overrideMe() {
}
}
public final class Sub extends Super {
// 초기화되지 않은 final 필드. 생성자에서 초기화한다.
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();
}
}
아이템 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라.
핵심 정리
@implSpec
을 사용할 수 있다.역할
이 설명되어 있어야 한다.구현 방식
등에 대한 정보가 문서화되어 있다면 구현이 국한된다.Javadoc 생성
@implSpec
을 모른다.-tag <name>:<locations>:<header>
사용으로 정의해준다.재정의 가능 메서드를 호출하는 생성자
super();
를 호출하기 때문에 문제 발생overrideMe()
null
을 콘솔에 찍게 되는 셈