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?).
Bloch рекомендует использовать шаблон построителя, который позволит вам написать что-то вроде этого:
Telescope telly = new Telescope.Builder("X/1999").setAdjustable(true).build();
Обратите внимание, что теперь параметры названы, и вы можете устанавливать их в любом порядке, в котором вы хотите, и вы можете пропустить те, которые вы хотите оставить со значениями по умолчанию. Это, конечно, намного лучше, чем телескопические конструкторы, особенно когда существует огромное количество параметров, принадлежащих многим из тех же типов.
Так что в Java нет механизма аргументов по умолчанию, но шаблон компоновщика в любом случае гораздо лучше.
Смотри также
Смежные вопросы