Не думаю, что вы можете сказать, что подходящим числом является «семь, не более» или «пять».
Хорошее практическое правило для конструкторов - передавать объекту его идентичность , а не его состояние . Те параметры, которые вы передаете, являются теми, которые необходимы для существования объекта, и без которых большинство операций объекта могут быть невозможны.
Если у вас действительно есть класс с очень сложной естественной идентичностью, следовательно, требующий много параметров, подумайте о дизайне вашего класса.
Пример плохого конструктора:
public NightWatchman(int currentFloor, int salary, int hapiness) {...}
Здесь NightWatchman создается с некоторыми значениями по умолчанию, которые почти наверняка изменятся за короткое время. Кажется забавным, что объекту сообщают об их значениях одним способом, а затем имеют их другим способом (через их установщики) в будущем.
Пример лучшего конструктора:
public GateWatchman(Gate watchedGate, boolean shootOnSight) {...}
Врата, за которыми наблюдает сторож, - это необходимая информация для существования. В классе я бы отметил это закрытый финал .
Я решил передать переменную shootOnSight в конструктор, потому что здесь было важно, чтобы объект всегда знал, стрелять ли грабителям. Здесь идентичность используется как тип.
У меня мог бы быть класс ShootingGateWatchman и PoliceCallingGateWatchman - т.е. параметр интерпретируется как часть идентификатора объекта.