К сожалению, Java не поддерживает такую конструкцию аргумента по умолчанию. Традиционный способ реализовать это, к лучшему или к худшему, заключается в использовании так называемых методов «телескопирования».
Вот цитата из Effective Java 2nd Edition, Item 2: Рассмотрите шаблон конструктора при наличии множества параметров конструктора:
Традиционно программисты использовали шаблон телескопический конструктор, в котором вы предоставляете конструктор только с обязательными параметрами, другой с одним необязательным параметром, третий с двумя необязательными параметрами и так далее...
Шаблон телескопического конструктора, по сути, выглядит примерно так:
public class Telescope {
final String name;
final int levels;
final boolean isAdjustable;
public Telescope(String name) {
this(name, 5);
}
public Telescope(String name, int levels) {
this(name, levels, false);
}
public Telescope(String name, int levels, boolean isAdjustable) {
this.name = name;
this.levels = levels;
this.isAdjustable = isAdjustable;
}
}
И теперь вы можете сделать любое из следующего:
new Telescope("X/1999");
new Telescope("X/1999", 13);
new Telescope("X/1999", 13, true);
Однако в настоящее время вы не можете установить только name
и isAdjustable
и оставить levels
по умолчанию. Вы можете предоставить больше перегрузок конструктора, но, очевидно, их число резко возрастет по мере роста количества параметров, и у вас может быть даже несколько аргументов boolean
и int
, что действительно приведет к беспорядку.
Как вы можете видеть, это не очень приятный шаблон для написания и еще менее приятный для использования (Что здесь означает «истина»? Сколько будет 13?).
Блох рекомендует использовать шаблон построителя, который позволит вам вместо этого написать что-то вроде этого:
Telescope telly = new Telescope.Builder("X/1999").setAdjustable(true).build();
Обратите внимание, что теперь параметры названы, и вы можете установить их в любом порядке, который вы хотите, и вы можете пропустить те, которые вы хотите оставить со значениями по умолчанию. Это, безусловно, намного лучше, чем телескопические конструкторы, особенно когда имеется огромное количество параметров, принадлежащих многим одинаковым типам.
Таким образом, в Java нет механизма аргументов по умолчанию, но шаблон построителя в любом случае является гораздо лучшей идиомой.
Смотрите также
Похожие вопросы
person
polygenelubricants
schedule
27.05.2010