Я прочитал рекомендацию в «Эффективной Java» использовать шаблон Builder, когда сталкиваюсь с конструкторами, использующими множество параметров.
Применяется ли тот же шаблон к методам с большим количеством параметров?
Я прочитал рекомендацию в «Эффективной Java» использовать шаблон Builder, когда сталкиваюсь с конструкторами, использующими множество параметров.
Применяется ли тот же шаблон к методам с большим количеством параметров?
Да вроде. По сути, вы создаете новый тип для инкапсуляции всех параметров или, может быть, только некоторых из них.
Теперь вы можете создать построитель, а затем неизменяемую версию типа — или вы можете просто разрешить изменять тип «убер-параметра» и передать его напрямую. В последнем случае вы не У шаблона построителя как такового нет, но вы можете своего рода рассматривать его как построение самого вызова метода, поскольку вы можете указать каждый аспект вызова метода отдельно. Вы можете возразить, что шаблон построителя на самом деле является частным случаем этого шаблона, в некотором роде - так уж получилось, что метод build()
обычно находится в построителе, а не имеет построителя в качестве параметра метода в другом месте, но существует определенная корреляция между как они работают.
Примером этого в среде .NET является XmlWriterSettings
, который передается в набор методов или конструкторов. (Он как бы используется в качестве построителя, обычно он используется при построении XmlWriter
.) Я не могу сейчас придумать какие-либо примеры в стандартной библиотеке Java, но они могут где-то существовать...
Однако, если вы обнаружите, что у вас много параметров, стоит еще раз взглянуть на дизайн, чтобы проверить, не следует ли вам в любом случае сгруппировать некоторые из них вместе, как часть обычного дизайна.
Не совсем так, потому что Builder
создает объект.
Так какой смысл менять какой-то метод, который черт знает что делает, на Builder
?
Что вы должны делать с методами, содержащими слишком много аргументов, например:
varargs
Collection
для ввода аргументов того же типаПревращение метода в строитель возможно, но нетипично. Apache HashCodeBuilder — один из примеров, используемый как int hash = new HashCodeBuilder().append(a).append(b).build();
, хотя в этом конкретном случае вы можете предпочесть просто использовать метод с переменными аргументами, например Objects.hashCode, используется как int hash = Objects.hashCode(a, b);
.
Метод, который принимает большое количество аргументов разных типов, плохо подходит для varargs, поэтому вы можете найти подходящий конструктор или рассмотреть возможность уменьшения объема работы, выполняемой в этот метод или инкапсуляция аргументов в какой-либо другой составной тип.