Бесплатный курс по java. Зарегистрируйтесь для отслеживания прогресса →

Java: Необязательные параметры методов

В программировании большое количество функций и методов имеют параметры, которые редко меняются. В таких случаях этим параметрам задают значения по умолчанию, которые можно поменять по необходимости. Этим немного сокращается количество одинакового кода. Гипотетический пример:

// Функция возведения в степень
// Второй параметр имеет значение по умолчанию 2
function pow(x, base = 2) {
  return x ** base;
}
pow(3); // 9, так как по умолчанию во вторую степень
pow(3, 3); // 27

В Java нет возможности задать значение по умолчанию, но, ее можно имитировать с помощью перегрузки методов. Что это такое? Java позволяет создать несколько методов с одинаковым именем. У этих методов должны быть либо другие типы входных параметров, либо другое число параметров или все это одновременно. Посмотрим на примере метода, складывающего два числа:

public static int sum(int x, int y) {
    return x + y;
}

App.sum(2, 3); // 5

Теперь напишем другой метод sum(), который принимает только один параметр и складывает его с числом 10.

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"

Перегрузка методов, может приводит к дублированию кода, особенно когда речь идет про значения по умолчанию. Логика, в таких ситуациях, одинаковая, разница лишь в начальной инициализации. Для снижения дублирования достаточно определить сначала общий метод, который принимает больше всего параметров, а затем вызывать его из тех методов, где есть значения по умолчанию:

// Это класс App

public static int sum(int x, int y) {
    return x + y;
}

public static int sum(int x) {
  // Вызываем уже готовый метод суммирования
  return Math.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"

Для выполнения задания вам понадобится метод StringUtils.leftPad(), который умеет заполнять строку указанным символом до определённой длины:

// Первый параметр – строка, которую дополняем
// Второй – длина, до которой нужно дополнить строку
// Третий – символ, которым заполняем
StringUtils.leftPad("21", 4, '+'); // "++21"
StringUtils.leftPad("hexlet", 9, '!'); // "!!!hexlet"

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе