- Есть ли в Java необязательные аргументы/параметры по умолчанию
- Java: Необязательные параметры методов
- Задание
- Использование необязательных параметров в Java
- Перегрузка методов
- Использование паттерна «Строитель»
- Использование Varargs
- Вывод
- Необязательные параметры методов — Основы Java
- Остались вопросы? Задайте их в разделе «Обсуждение»
- Открыть доступ
Есть ли в Java необязательные аргументы/параметры по умолчанию
Всем привет! Java тока учу, подскажите, пожалуйста, есть ли в Java необязательные аргументы, ну т.е. те, которые можно как-то обозначить в методе, и потом вызывать его без них? Или обязательно нужно перегружать метод для каждого количества аргументов?
Необязательные параметры (значения по умолчанию) методов класса
Коллеги, добрый день. Учусь, потому прошу не судить строго. Сразу отмечу, что подобный вопрос.
необязательные аргументы
хочу свои функции так писать, т.е. чтобы можно было объявлять в функции \ процедуре необязательные.
Полиморфизм и необязательные аргументы метода
Подскажите пожалуйста, как компилируется и как выполняется такая программа. Я учу полиморфизм и.
Необязательные параметры
Народ, подскажите, пожалуйста, как в отчёт добавить необязательный параметр? Есть регистр.
нет в java нельзя сделать то, о чем ты спрашиваешь, в интересующем тебя виде. Но можно реализовать это все через перегрузку методов.
void method(String s, int i) {} void method(String s) { method(s, 10); }
Сообщение от aleksandy
почему нельзя, а «тигрятина» для чего тогда придумана (или массив как в main)?
просто придётся самому типы определять когда будешь разворачивать из Object
public class VarArgs { public static void main(String[] args) { new VarArgs().var(); new VarArgs().var(1, new String("aaa")); } private void var(Object . arg) { System.out.println(arg.length); } }
Сообщение от mutagen
почему нельзя, а «тигрятина» для чего тогда придумана (или массив как в main)?
просто придётся самому типы определять когда будешь разворачивать из Object
Потеря типизации и дополнительные преобразования, имхо, убивают все преимущества аргументов по умолчанию в таком виде. Проще и эффективнее сделать перегрузку как показал aleksandy. Там и контролируется всё, и умолчания сразу видны.
Сообщение от Skipy
мы же говорим о возможности, а не о удобстве. Иногда проще с перегрузками, иногда с тиграми, особенно, когда не знаешь какой обьект припрётся например по сетке, определил его тип и заюзал через прокси для этого типа и не надо мильён оверлоадов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
class Employee { // Три перегруженных конструктора. public Employee(String n, double s) { name = n; salary = s; } public Employee(double s) { // Вызов конструктора Employee(String, double). this("Сотрудник #" + nextld, s); } // Конструктор по умолчанию. public Employee() { // Поле name инициализируется как ""-- см. ниже. // Поле salary задается неявно -- инициализируется нулем. // Поле id задается в блоке инициализиации. }
Брррррр!
Я не понимаю чё такое «тигрятина», и прочие страшные слова
Просто вопрос, можно ли сделать что-то вроде как в vb:
sub main(i As Integer, optional L As Long=1024) тра-та-та. 'где L будет равно или заданному параметру; или 1024, если параметр не задан end sub
Просто чтоб не описывать каждый метод в отдельности, а написать один, и дёргать его с нужными или ненужными параметрами! Я про такое спрашивала.
Терь ухом чую, что без перегрузки не обойтись.
Сообщение от mutagen
mutagen, пасиба, но твой пример немного не подходит. Там всё равно в массив придётся передавать какие-то значения, а я имею ввиду «значения в методе по-умолчанию уже есть», т.е. если их не задавать, то они всё-равно будут.
Блин, надеюсь понятно написала.
P.S. Всё равно всем откликнувшимся спасибо.
Java: Необязательные параметры методов
В программировании большое количество функций и методов имеют параметры, которые редко меняются.
В таких случаях этим параметрам задают значения по умолчанию, которые можно поменять по необходимости. Этим немного сокращается количество одинакового кода.
Это наглядно видно на таком примере:
class App < // Функция возведения в степень // Степень — это второй параметр со значением по умолчанию 2 function pow(x, base = 2) < return x ** base; >> App.pow(3); // Результат — 9, так как по умолчанию возводим во вторую степень // Возводим в третью степень App.pow(3, 3); // 27
В отличие от других языков, в Java нет возможности задать значение по умолчанию, но ее можно имитировать с помощью перегрузки методов.
Что это такое? Java позволяет создать несколько методов с одинаковым именем. У таких одинаковых методов должны быть:
- Разные типы входных параметров
- Разное количество параметров
- Или все это одновременно
Посмотрим на примере метода, складывающего два числа:
Теперь напишем другой метод 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. В других языках программирования, таких как Python или JavaScript, есть возможность установки значений по умолчанию для параметров, что позволяет их делать необязательными. В Java же такой возможности нет.
Предположим, есть функция, которая принимает три параметра.
public void exampleFunction(int param1, int param2, int param3) < // код функции >
Однако, в определенных случаях, третий параметр может быть необязательным. Как быть в таких ситуациях?
Перегрузка методов
Один из способов — это перегрузка методов. Можно создать второй метод с тем же именем, но меньшим количеством параметров.
public void exampleFunction(int param1, int param2) < exampleFunction(param1, param2, 0); // 0 - значение по умолчанию >
Таким образом, при вызове exampleFunction(param1, param2) , будет вызываться метод с двумя параметрами, который в свою очередь вызывает исходный метод exampleFunction(param1, param2, param3) с параметром по умолчанию.
Использование паттерна «Строитель»
Еще один способ — это использование паттерна «Строитель» (Builder). Этот паттерн позволяет создавать различные варианты объекта, избегая перегрузки конструктора.
public class Example < private int param1; private int param2; private int param3; public static class Builder < private int param1; private int param2 = 0; // значение по умолчанию public Builder(int param1) < this.param1 = param1; >public Builder param2(int param2) < this.param2 = param2; return this; >public Example build() < Example example = new Example(); example.param1 = this.param1; example.param2 = this.param2; return example; >> private Example() <> >
Использование объекта будет выглядеть следующим образом: Example example = new Example.Builder(1).param2(2).build();
Использование Varargs
Еще одним вариантом является использование varargs. Это позволяет принимать любое количество аргументов одного типа. Однако, это должно быть последним параметром в списке.
public void exampleFunction(int param1, int param2, int. param3) < int value = (param3.length > 0) ? param3[0] : 0; // 0 - значение по умолчанию >
Таким образом, можно вызвать exampleFunction(param1, param2) или exampleFunction(param1, param2, param3) .
Вывод
Java не поддерживает необязательные параметры напрямую, как это делают некоторые другие языки программирования. Однако, существуют различные способы обхода этой проблемы, включая перегрузку методов, использование паттерна «Строитель» и использование varargs.
Необязательные параметры методов — Основы 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 sum(x, 10); > >
В этом примере мы не сократили код, но он наглядно показывает принцип, описанный выше.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Об обучении на Хекслете
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях: