Java: Необязательные параметры методов
В программировании у многих методов есть параметры, которые редко меняются. Часто такому параметру удобно задать одно значение и подставлять его, когда при вызове ничего другого не передали. Такое значение называют значением по умолчанию.
Во многих языках значение по умолчанию пишут прямо в определении. Например, в Python метод возведения в степень выглядит так:
# Степень — это второй параметр со значением по умолчанию 2
def pow(x, exponent=2):
return x**exponent
pow(3) # 9, по умолчанию возводим во вторую степень
pow(3, 3) # 27, степень передана явноВ Java у параметров нет значений по умолчанию. Зато тот же результат достигается через перегрузку методов.
Что это такое? Java позволяет создать несколько методов с одинаковым именем. У таких одинаковых методов должны быть:
- Разные типы входных параметров
- Разное количество параметров
- Или все это одновременно
Посмотрим на примере метода, складывающего числа. Создадим две версии sum() в одном классе. Первая принимает два числа, вторая принимает только одно и прибавляет к нему 10:
class App {
public static int sum(int x, int y) {
return x + y;
}
public static int sum(int x) {
return x + 10;
}
}
App.sum(2, 3); // 5, сработала версия с двумя параметрами
App.sum(2); // 12, сработала версия с одним параметромКомпилятор без проблем создаст два метода с одним именем. Как Java узнает, какой из них вызвать?
Во время компиляции выбирается та версия метода, которая совпадает по типу и количеству параметров. Когда подходящего метода нет, компилятор сообщает об ошибке.
Как минимум с одним перегруженным методом мы уже встречались — это метод substring(). По умолчанию он извлекает подстроку до конца, но ему можно передать второй параметр, который ограничит длину:
// Вызываются два разных метода с одним именем
"hexlet".substring(3); // "let"
"hexlet".substring(3, 5); // "le"Перегрузка методов может приводить к дублированию кода, особенно когда речь идет про значения по умолчанию. В таких ситуациях логика одинаковая, разница лишь в начальной инициализации.
Для снижения дублирования достаточно сделать два шага:
- Сначала определить общий метод, который принимает больше всего параметров
- Затем вызывать его из тех методов, где есть значения по умолчанию
В коде это выглядит так:
class App {
public static int sum(int x, int y) {
return x + y;
}
public static int sum(int x) {
// Вызываем уже готовый метод суммирования
return App.sum(x, 10);
}
}В этом примере мы не сократили код, но он наглядно показывает принцип, описанный выше.
Задание
Реализуйте метод getHiddenCard(), который принимает на вход номер кредитки (состоящий из 16 цифр) в виде строки и возвращает его скрытую версию, которая может использоваться на сайте для отображения. Если исходная карта имела номер 2034399002125581, то скрытая версия выглядит так ****5581. Другими словами, функция заменяет первые 12 символов, на звездочки. Количество звездочек регулируется вторым необязательным параметром. Значение по умолчанию — 4.
// Кредитка передается внутрь как строка
App.getHiddenCard("1234567812345678", 2); // "**5678"
App.getHiddenCard("1234567812345678", 3); // "***5678"
App.getHiddenCard("1234567812345678"); // "****5678"
App.getHiddenCard("2034399002121100", 1); // "*1100"Для выполнения задания вам понадобится метод строки repeat, который повторяет строку указанное количество раз
"+".repeat(5); // "+++++"
"o".repeat(5); // "ooooo"Java: Необязательные параметры методов
В программировании у многих методов есть параметры, которые редко меняются. Часто такому параметру удобно задать одно значение и подставлять его, когда при вызове ничего другого не передали. Такое значение называют значением по умолчанию.
Во многих языках значение по умолчанию пишут прямо в определении. Например, в Python метод возведения в степень выглядит так:
# Степень — это второй параметр со значением по умолчанию 2
def pow(x, exponent=2):
return x**exponent
pow(3) # 9, по умолчанию возводим во вторую степень
pow(3, 3) # 27, степень передана явноВ Java у параметров нет значений по умолчанию. Зато тот же результат достигается через перегрузку методов.
Что это такое? Java позволяет создать несколько методов с одинаковым именем. У таких одинаковых методов должны быть:
- Разные типы входных параметров
- Разное количество параметров
- Или все это одновременно
Посмотрим на примере метода, складывающего числа. Создадим две версии sum() в одном классе. Первая принимает два числа, вторая принимает только одно и прибавляет к нему 10:
class App {
public static int sum(int x, int y) {
return x + y;
}
public static int sum(int x) {
return x + 10;
}
}
App.sum(2, 3); // 5, сработала версия с двумя параметрами
App.sum(2); // 12, сработала версия с одним параметромКомпилятор без проблем создаст два метода с одним именем. Как Java узнает, какой из них вызвать?
Во время компиляции выбирается та версия метода, которая совпадает по типу и количеству параметров. Когда подходящего метода нет, компилятор сообщает об ошибке.
Как минимум с одним перегруженным методом мы уже встречались — это метод substring(). По умолчанию он извлекает подстроку до конца, но ему можно передать второй параметр, который ограничит длину:
// Вызываются два разных метода с одним именем
"hexlet".substring(3); // "let"
"hexlet".substring(3, 5); // "le"Перегрузка методов может приводить к дублированию кода, особенно когда речь идет про значения по умолчанию. В таких ситуациях логика одинаковая, разница лишь в начальной инициализации.
Для снижения дублирования достаточно сделать два шага:
- Сначала определить общий метод, который принимает больше всего параметров
- Затем вызывать его из тех методов, где есть значения по умолчанию
В коде это выглядит так:
class App {
public static int sum(int x, int y) {
return x + y;
}
public static int sum(int x) {
// Вызываем уже готовый метод суммирования
return App.sum(x, 10);
}
}В этом примере мы не сократили код, но он наглядно показывает принцип, описанный выше.
Задание
Реализуйте метод getHiddenCard(), который принимает на вход номер кредитки (состоящий из 16 цифр) в виде строки и возвращает его скрытую версию, которая может использоваться на сайте для отображения. Если исходная карта имела номер 2034399002125581, то скрытая версия выглядит так ****5581. Другими словами, функция заменяет первые 12 символов, на звездочки. Количество звездочек регулируется вторым необязательным параметром. Значение по умолчанию — 4.
// Кредитка передается внутрь как строка
App.getHiddenCard("1234567812345678", 2); // "**5678"
App.getHiddenCard("1234567812345678", 3); // "***5678"
App.getHiddenCard("1234567812345678"); // "****5678"
App.getHiddenCard("2034399002121100", 1); // "*1100"Для выполнения задания вам понадобится метод строки repeat, который повторяет строку указанное количество раз
"+".repeat(5); // "+++++"
"o".repeat(5); // "ooooo"Ваше упражнение проверяется по этим тестам
import static org.assertj.core.api.Assertions.assertThat;
class AppTest {
public static void main(String[] args) {
var actual = App.getHiddenCard("1234123412341234");
assertThat(actual).isEqualTo("****1234");
var actual2 = App.getHiddenCard("1234123412344321", 6);
assertThat(actual2).isEqualTo("******4321");
}
}Решение учителя откроется через:
20:00
