- EX) 백그라운드 스레드나 정적 초기화 과정에서도 호출이 일어날 수 있다.
- 메소드 주석에 @implSpec 태그 붙여주면 자바독 도구가 생성해준다.
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(); // null, instant
}
}
들 증 하나라도 구현한 클래스를 상속할 수 있게 설계하는 것은 일반적으로 좋은 생각이 아니다.
- clone이 완벽하지 못했어서 복제본 내부 어딘가에서 여전히 원본 객체의 데이터를 참조하고 있다면 원본 객체에도 피해를 줄 수 있다.
- priavte으로 선언하면 하위 클래스에서 무시되기 때문이다. 이 역시 상속을 허용하기 위해 내부 구현을 클래스 API로 공개하는 예 중 하나이다.
- 내부에서 다양한 하위 클래스를 만들어 쓸 수 있는 유연성을 준다.
public method () {
helpingMethod();
}
private helpingMethod () {
...
}
Reference: