Java Конструктор который использует сеттер - как использовать инкапсуляцию, если это антипаттерн?

Столкнулся с такой дилеммой - с одной стороны сеттеры позволяют нам создавать проверки входных данных на корректность значений, а в случае сложной бизнес логики выполняются действия с входными данными прежде чем они запишутся в поля класса. Однако, как я узнал чуть позже - использовать сеттеры в конструкторах является антипаттерном.

И как же тогда мне поступить, если нельзя использовать сеттеры, и это плохой тон программирования. - использовать логику в конструкторе можно, но тогда не понятен смысл инкапсуляции если проверки в сеттерах на корректность входных данных никак не повлияет на результат - либо проверка в конструкторе и сеттер вообще не при делах.

Можно, конечно сделать конструктор приватным, тогда данные будут поступать только через сеттеры. Не понимаю как использовать сеттеры на практике если нужно не только сокрытие данных, но и бизнеслогика на входе.


Ответы (2 шт):

Автор решения: Maksim

Мне кажется, что если перед записью данных выполняется какая либо бизнес логика, то логично поместить её в приватный метод, и использовать его в и сеттере и в конструкторе.

→ Ссылка
Автор решения: Саломатин Г. С.

Чтобы избежать потенциальных проблем с кодом "Конструкторы класса не должны вызывать переопределяемые методы" (JAVA:Эффективное программирование. 2е издание, Джошуа Блох. Статья 17) я просто сделал сеттеры неизменяемыми (final), что защитит код и одновременно позволяет использовать сеттеры в конструкторах без опасения.

→ Ссылка