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
}
Здесь имя
является обязательным полем, так как у нашего чая
должно быть хотя бы имя.
Тогда не может быть чая без чайного порошка. Итак, мы предположим, что пользователь хочет добавить в чай стандартную 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 .