Logo
Книга для начинающих
ВходРегистрация
/
Программирование
/
Курс Java
/

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

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

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

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

Это наглядно видно на таком примере:

// Пример того, как задаются параметры по умолчанию в языке JavaScript
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);
    }
}

В этом примере мы не сократили код, но он наглядно показывает принцип, описанный выше.

Задание

Реализуйте метод 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
/

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

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

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

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

Это наглядно видно на таком примере:

// Пример того, как задаются параметры по умолчанию в языке JavaScript
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);
    }
}

В этом примере мы не сократили код, но он наглядно показывает принцип, описанный выше.

Задание

Реализуйте метод 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 Test {
    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

waiting_clock
← ПредыдущийСледующий →