From cde1c06e5d70f9b7fe2e30b2b88dc5e600506f76 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Thu, 25 Jun 2026 19:53:46 +0500 Subject: [PATCH] =?UTF-8?q?feat(35-methods-using):=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=20=D1=83=D1=80=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20?= =?UTF-8?q?=D1=81=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=BC=20=D1=87=D0=B8=D1=81=D0=BB=D0=BE=D0=BC=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Перенос DEFER-темы из Python (35-calling-functions/180-variadic-parameters), адаптация под Java varargs. Урок 300-variadic-parameters (RU-only): теория про переменное число аргументов (String.join/format, синтаксис Type...), упражнение на вызов встроенного variadic-метода String.join. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../300-variadic-parameters/App.java | 7 +++++ .../300-variadic-parameters/Makefile | 2 ++ .../300-variadic-parameters/Test.java | 10 +++++++ .../300-variadic-parameters/ru/EXERCISE.md | 7 +++++ .../300-variadic-parameters/ru/README.md | 30 +++++++++++++++++++ .../300-variadic-parameters/ru/data.yml | 12 ++++++++ 6 files changed, 68 insertions(+) create mode 100644 modules/35-methods-using/300-variadic-parameters/App.java create mode 100644 modules/35-methods-using/300-variadic-parameters/Makefile create mode 100644 modules/35-methods-using/300-variadic-parameters/Test.java create mode 100644 modules/35-methods-using/300-variadic-parameters/ru/EXERCISE.md create mode 100644 modules/35-methods-using/300-variadic-parameters/ru/README.md create mode 100644 modules/35-methods-using/300-variadic-parameters/ru/data.yml diff --git a/modules/35-methods-using/300-variadic-parameters/App.java b/modules/35-methods-using/300-variadic-parameters/App.java new file mode 100644 index 00000000..ade9b748 --- /dev/null +++ b/modules/35-methods-using/300-variadic-parameters/App.java @@ -0,0 +1,7 @@ +public class App { + public static String makeSentence() { + // BEGIN + return String.join(" ", "Java", "is", "awesome"); + // END + } +} diff --git a/modules/35-methods-using/300-variadic-parameters/Makefile b/modules/35-methods-using/300-variadic-parameters/Makefile new file mode 100644 index 00000000..d0d0a48c --- /dev/null +++ b/modules/35-methods-using/300-variadic-parameters/Makefile @@ -0,0 +1,2 @@ +test: + @ test.sh diff --git a/modules/35-methods-using/300-variadic-parameters/Test.java b/modules/35-methods-using/300-variadic-parameters/Test.java new file mode 100644 index 00000000..89c753eb --- /dev/null +++ b/modules/35-methods-using/300-variadic-parameters/Test.java @@ -0,0 +1,10 @@ +import static org.assertj.core.api.Assertions.assertThat; + +class Test { + public static void main(String[] args) { + var actual = App.makeSentence(); + System.out.println(actual); + + assertThat(actual).isEqualTo("Java is awesome"); + } +} diff --git a/modules/35-methods-using/300-variadic-parameters/ru/EXERCISE.md b/modules/35-methods-using/300-variadic-parameters/ru/EXERCISE.md new file mode 100644 index 00000000..37f23324 --- /dev/null +++ b/modules/35-methods-using/300-variadic-parameters/ru/EXERCISE.md @@ -0,0 +1,7 @@ +Реализуйте метод `makeSentence()`. Внутри него с помощью метода `String.join()` соберите предложение из отдельных слов `Java`, `is` и `awesome`, разделяя их пробелами. Метод должен вернуть готовую строку. + +```java +App.makeSentence(); // => "Java is awesome" +``` + +Первым аргументом в `String.join()` передается разделитель (пробел), а дальше — переменное число слов, которые нужно соединить. diff --git a/modules/35-methods-using/300-variadic-parameters/ru/README.md b/modules/35-methods-using/300-variadic-parameters/ru/README.md new file mode 100644 index 00000000..5695a77c --- /dev/null +++ b/modules/35-methods-using/300-variadic-parameters/ru/README.md @@ -0,0 +1,30 @@ +Большинство методов принимают фиксированное количество аргументов: сколько параметров указано при объявлении, столько значений и нужно передать. Но есть методы, которым можно передать сколько угодно аргументов — от нуля до десятков. Такие методы называют **методами с переменным числом параметров** (по-английски *variadic*). + +Хороший пример — метод `String.join()`. Он соединяет строки через разделитель, и количество соединяемых строк может быть любым: + +```java +String.join("-", "2024", "01", "15"); // "2024-01-15" +String.join(" ", "Привет", "мир"); // "Привет мир" +String.join(", ", "a", "b", "c", "d"); // "a, b, c, d" +``` + +Первый аргумент — это разделитель, а всё, что идёт после него, и есть переменное число строк. В первом вызове их три, во втором — две, в третьем — четыре. Метод сам подстраивается под любое количество аргументов. + +Так же устроены методы `String.format()` и `System.out.printf()` — им тоже можно передавать разное число аргументов в зависимости от того, сколько значений нужно подставить. + +## Как это устроено + +Когда метод объявляют, переменное число параметров записывают с помощью трёх точек после типа: + +```java +// String... values — это и есть переменное число строковых аргументов +public static String join(String separator, String... values) { + // тут код, который обрабатывает values +} +``` + +Запись `String...` означает «ноль или больше строк». Обязательные параметры (как `separator`) идут первыми, а переменная часть — всегда последней. Внутри метода эти аргументы доступны как обычный массив, поэтому по ним можно пройтись и что-то с ними сделать. Определять такие методы мы научимся позже, а пока важно уметь ими пользоваться. + +## Зачем это нужно + +Переменное число параметров делает методы гибкими. Не нужно создавать отдельные методы `join2()`, `join3()`, `join4()` под каждое количество строк — достаточно одного метода, который примет их сколько угодно. Это убирает дублирование и упрощает работу со стандартной библиотекой: огромное число её методов рассчитано именно на переменное число аргументов. diff --git a/modules/35-methods-using/300-variadic-parameters/ru/data.yml b/modules/35-methods-using/300-variadic-parameters/ru/data.yml new file mode 100644 index 00000000..08d09f24 --- /dev/null +++ b/modules/35-methods-using/300-variadic-parameters/ru/data.yml @@ -0,0 +1,12 @@ +--- +name: Методы с переменным числом параметров +tips: + - > + [Метод String.join() в + документации](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html) +definitions: + - name: Переменное число параметров (varargs) + description: >- + возможность метода принимать любое количество аргументов одного типа. В + объявлении записывается через три точки после типа, например `String... + values`.