Позволить внешнему миру нарушить ваши инварианты никогда не является хорошей идеей, поскольку ваш класс становится бесполезным: поскольку я не могу полагаться на его внутреннее состояние, являющееся непротиворечивым, это всего лишь мешок значений, не связанных с друг с другом. Чтобы писать правильные программы, мне нужно было бы реплицировать всю вашу логику валидации в строке перед каждым использованием этого класса.
Кстати, ваш пример реализации может войти в противоречивое состояние даже без метода betterKnowWhatYoureDoing...
, и я даже не упоминаю многопоточность.
Вы можете предотвратить это, просто сделав класс неизменным и выполнив эту проверку в конструкторе.
Я думаю, вы должны тщательно пересмотреть свой дизайн, прежде чем идти по этому маршруту.
Если вы должны предоставить такую функциональность (я едва ли могу себе представить причину этого), по крайней мере, сделайте его закрытым для пакета (вместо public
и , задокументированных как "опасные"). ).
Кроме того, те, кто действительно знает, что они делают, вероятно, никогда не будут вызывать этот метод в любом случае, так что это немного бессмысленно ...:)