Java: Необязательные параметры методов
В программировании большое количество функций и методов имеют параметры, которые редко меняются.
В таких случаях этим параметрам задают значения по умолчанию, которые можно поменять по необходимости. Этим немного сокращается количество одинакового кода.
Это наглядно видно на таком примере:
class App {
// Функция возведения в степень
// Степень — это второй параметр со значением по умолчанию 2
function pow(x, base = 2) {
return x ** base;
}
}
App.pow(3); // Результат — 9, так как по умолчанию возводим во вторую степень
// Возводим в третью степень
App.pow(3, 3); // 27
В отличие от других языков, в Java нет возможности задать значение по умолчанию, но ее можно имитировать с помощью перегрузки методов.
Что это такое? Java позволяет создать несколько методов с одинаковым именем. У таких одинаковых методов должны быть:
- Разные типы входных параметров
- Разное количество параметров
- Или все это одновременно
Посмотрим на примере метода, складывающего два числа:
class App {
public static int sum(int x, int y) {
return x + y;
}
}
App.sum(2, 3); // 5
Теперь напишем другой метод sum()
, который принимает только один параметр и складывает его с числом 10:
class App {
public static int sum(int x) {
return x + 10;
}
}
App.sum(2); // 12
App.sum(2, 1); // 3
Компилятор без проблем выполнит такой код и создаст два метода с одним именем. Как 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);
}
}
https://replit.com/@hexlet/java-basics-default-parameters
В этом примере мы не сократили код, но он наглядно показывает принцип, описанный выше.
Задание
Реализуйте метод 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"
Упражнение не проходит проверку — что делать? 😶
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя 🤔
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно 🙄
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.