재정의 가능 메서드를 내부적으로 어떻게 사용하는지 반드시 문서에 남기라는 뜻이다.

즉, 재정의 가능 메서드가 호출되는 모든 상황을 문서로 남겨야 한다는 규칙이다. 문서만 제대로 썼다고 계승에 적합한 설계가 되지는 않는다. 너무 애쓰지 않고도 효율적인 하위 클래스를 작성할 수 있도록 하려면 클래스 내부 동작에 개입할 수 있는 훅을 신중하게 고른 protected 메서드 형태로 제공해야 한다. 
 그렇다면 계승을 고려하여 클래스를 설계할 때 protected로 선언할 멤버는 어떻게 정하나? 직접해볼 수 밖에 없단다..ㄷㄷ.. 왜냐하면 널리 사용될 클래스를 계승에 맞게 설계하고, 메서드와 필드를 protected로 선언하는 과정에서 발생하는 결정들은 영원히 고수해야 하기 때문이다. 

계승을 허용하려면 반드시 따라야할 제약사항

1. 생성자는 직접적이건 간접적이건 재정의 가능 메서드를 호출해서는 안된다. 부모 클래스의 생성자가 자식 클래스의 생성자보다 먼저 호출되기 때문에 메서드 동작을 보장할 수 없기 때문이다.

2. clone이나 readObject 메서드 안에서 직접적이건 간접적이건 재정의 가능한 메서드를 호출하지 않도록 주의해야 한다. readObject 메서드 안에서 재정의 가능 메서드를 호출하게 되면 , 역직렬화가 되기전에 해당 메서드가 실행되어 버린다. 그리고 clone메서드의 경우라면 하위 클래스의 clone메서드가 복사본 객체의 상태를 미처 수정하기도 전에 해당 메서드가 실행되어 버린다.

요약

계승에 맞도록 설계하고 문서화하지 않은 클래스에 대한 하위 클래스는 만들지 않는 것이다. 


+ Recent posts