§17 Проектируйте и документируйте наследование или запрещайте его
В классе должно быть описано его собственное использование переопределяемых методов. (переопределяемые – не final и public или protected) По соглашению, это описание следует за описанием метода и начинается со слов This implementation
java.util.AbstractCollection
Это противоречит факту, что хорошая документация API должна описывать, что делает метод, но не как. От класса может потребоваться создание механизма для диагностирования своей собственной внутренней деятельности в виде правильно выбранных защищенных методов или, в редких случаях, защищенных полей.
Например, java.util.AbstractList
Единственный способ протестировать класс спроектированный для наследования – это создать наследника. (как правило достаточно 3х экземпляров и как минимум один должен быть написан не автором класса) Такой метод тестирования _настоятельно_ рекомендуется перед опубликованием класса.
Конструкторы не должны вызывать переопределяемые методы.
Аналогичные трудности ждут при реализации Clonable или Serializable Ни clone ни readObject не должны вызывать переопределяемые методы, напрямую или косвенно. Создание класса ориентированного на наследование накладывает серьезные ограничения. Лучшее решение – избегать наследования от неподходящих для этого классов.