Принцип open-closed гласит, что "объекты программного обеспечения (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для модификации".
Однако Джошуа Блох в своей знаменитой книге "Эффективная Ява" дает следующий совет: "Дизайн и документ для наследования или запрет", и призывает программистов использовать "окончательный" модификатор для запрещения подкласса.
Я думаю, что эти два принципа явно противоречат друг другу (я не прав?). Какой принцип вы придерживаетесь при написании кода и почему? Вы оставляете свои классы открытыми, запрещаете наследование некоторых из них (какие?) Или используете последний модификатор, когда это возможно?