В некоторых наших проектах есть иерархия классов, которая добавляет дополнительные параметры по мере продвижения по цепочке. Внизу некоторые классы могут иметь до 30 параметров, 28 из которых просто передаются в суперконструктор.
Я признаю, что использование автоматического DI через что-то вроде Guice было бы неплохо, но по некоторым техническим причинам эти конкретные проекты ограничены Java.
Соглашение об организации аргументов в алфавитном порядке по типу не работает, потому что, если тип подвергается рефакторингу (круг, который вы передали для аргумента 2, теперь является фигурой), он может внезапно выйти из строя.
Этот вопрос может быть конкретным и чреватым критикой типа «Если это ваша проблема, вы делаете это неправильно на уровне дизайна», но я просто ищу любые точки зрения.
buildStudent()
метод генерировать исключение.Можете ли вы инкапсулировать связанные параметры внутри объекта?
например, если параметры похожи на
тогда вы могли бы вместо этого иметь:
источник
Возможно, вы захотите создать класс Builder. Тогда вы бы сделали что-то вроде этого:
См. Стр. 8 и последующие этой презентации Джоша Блоха (PDF) или этот обзор Effective Java.
источник
Что ж, использование шаблона построителя может быть одним из решений.
Но как только вы дойдете до 20-30 параметров, я бы предположил, что между параметрами существует высокая взаимосвязь. Поэтому (как предлагается) заключить их в логически разумные объекты данных, вероятно, имеет наибольший смысл. Таким образом, объект данных уже может проверить действительность ограничений между параметрами.
Для всех моих прошлых проектов, когда я дошел до того, что у меня слишком много параметров (а это было 8, а не 28!), Я смог очистить код, создав лучшую модель данных.
источник
Поскольку вы ограничены Java 1.4, если вы хотите DI, тогда Spring будет очень достойным вариантом. DI полезен только в тех местах, где параметры конструктора являются службами или чем-то, что не меняется во время выполнения.
Если у вас есть все эти разные конструкторы из-за того, что вам нужны переменные параметры для создания объекта, вам следует серьезно подумать об использовании шаблона Builder.
источник
Лучшее решение - не использовать слишком много параметров в конструкторе. Только параметры, действительно необходимые в конструкторе, - это параметры, необходимые для правильной инициализации объекта. У вас могут быть конструкторы с несколькими параметрами, но также есть конструктор с минимальными параметрами. Дополнительные конструкторы вызывают этот простой конструктор, а затем установщики для установки других параметров. Таким образом, вы можете избежать цепной проблемы с все большим и большим количеством параметров, а также иметь некоторые удобные конструкторы.
источник
Я действительно рекомендую использовать Immutables или POJOBuilder при использовании шаблона строителя.
источник
Рефакторинг для уменьшения количества параметров и глубины иерархии наследования - это почти все, о чем я могу думать, потому что на самом деле ничто не поможет сохранить правильность 20-с чем-то параметров. Вам просто нужно будет каждый раз звонить, просматривая документацию.
Одна вещь, которую вы могли бы сделать, - это сгруппировать некоторые логически сгруппированные параметры в их собственный объект более высокого уровня, но у этого есть свои проблемы.
источник