«1. Обзор

В этом кратком руководстве мы продемонстрируем использование перегрузки методов для имитации параметров по умолчанию в Java.

Здесь мы говорим «имитация», потому что в отличие от некоторых других языков ООП (таких как C++ и Scala) спецификация Java не поддерживает присвоение значения по умолчанию параметру метода.

2. Пример

В качестве примера заварим чай! Во-первых, нам понадобится Tea POJO:

public class Tea {

    static final int DEFAULT_TEA_POWDER = 1;

    private String name; 
    private int milk;
    private boolean herbs;
    private int sugar;
    private int teaPowder;

    // standard getters 
}

Здесь имя является обязательным полем, так как у нашего Tea должно быть хотя бы имя.

Тогда не может быть чая без чайного порошка. Итак, мы предположим, что пользователь хочет добавить в чай ​​стандартную 1 столовую ложку чайного порошка, если он не был предоставлен во время вызова. Это наш первый параметр по умолчанию.

Другими необязательными параметрами являются молоко (в мл), травы (добавлять или не добавлять) и сахар (в столовых ложках). Если какие-либо из их значений не указаны, мы предполагаем, что они не нужны пользователю.

Давайте посмотрим, как добиться этого в Java с помощью перегрузки методов:

public Tea(String name, int milk, boolean herbs, int sugar, int teaPowder) {
    this.name = name;
    this.milk = milk;
    this.herbs = herbs;
    this.sugar = sugar;
    this.teaPowder = teaPowder;
}

public Tea(String name, int milk, boolean herbs, int sugar) {
    this(name, milk, herbs, sugar, DEFAULT_TEA_POWDER);
}

public Tea(String name, int milk, boolean herbs) {
    this(name, milk, herbs, 0);
}

public Tea(String name, int milk) {
    this(name, milk, false);
}

public Tea(String name) {
    this(name, 0);
}

Как видно, здесь мы используем цепочку конструкторов, форму перегрузки, чтобы предоставить параметрам метода некоторые значения по умолчанию.

Теперь давайте добавим простой тест, чтобы увидеть это в действии:

@Test
public void whenTeaWithOnlyName_thenCreateDefaultTea() {
    Tea blackTea = new Tea("Black Tea");

    assertThat(blackTea.getName()).isEqualTo("Black Tea");
    assertThat(blackTea.getMilk()).isEqualTo(0);
    assertThat(blackTea.isHerbs()).isFalse();
    assertThat(blackTea.getSugar()).isEqualTo(0);
    assertThat(blackTea.getTeaPowder()).isEqualTo(Tea.DEFAULT_TEA_POWDER);
}

3. Альтернативы

Есть и другие способы добиться моделирования параметров по умолчанию в Java. Вот некоторые из них:

    использование шаблона Builder с использованием опционального разрешения пустых значений в качестве аргументов метода

Вот как мы можем использовать третий способ разрешения пустых аргументов в нашем примере:

public Tea(String name, Integer milk, Boolean herbs, Integer sugar, Integer teaPowder) {
    this.name = name;
    this.milk = milk == null ? 0 : milk.intValue();
    this.herbs = herbs == null ? false : herbs.booleanValue();
    this.sugar = sugar == null ? 0 : sugar.intValue();
    this.teaPowder = teaPowder == null ? DEFAULT_TEA_POWDER : teaPowder.intValue();
}

4. Заключение ~~ ~ В этой статье мы рассмотрели использование перегрузки методов для имитации параметров по умолчанию в Java.

Хотя есть и другие способы добиться того же, перегрузка является наиболее чистой и простой. Как всегда, код доступен на GitHub.

«