Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions modules/35-methods-using/300-variadic-parameters/App.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
public class App {
public static String makeSentence() {
// BEGIN
return String.join(" ", "Java", "is", "awesome");
// END
}
}
2 changes: 2 additions & 0 deletions modules/35-methods-using/300-variadic-parameters/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
test:
@ test.sh
10 changes: 10 additions & 0 deletions modules/35-methods-using/300-variadic-parameters/Test.java
Original file line number Diff line number Diff line change
@@ -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");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Реализуйте метод `makeSentence()`. Внутри него с помощью метода `String.join()` соберите предложение из отдельных слов `Java`, `is` и `awesome`, разделяя их пробелами. Метод должен вернуть готовую строку.

```java
App.makeSentence(); // => "Java is awesome"
```

Первым аргументом в `String.join()` передается разделитель (пробел), а дальше — переменное число слов, которые нужно соединить.
30 changes: 30 additions & 0 deletions modules/35-methods-using/300-variadic-parameters/ru/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
Большинство методов принимают фиксированное количество аргументов: сколько параметров указано при объявлении, столько значений и нужно передать. Но есть методы, которым можно передать сколько угодно аргументов — от нуля до десятков. Такие методы называют **методами с переменным числом параметров** (по-английски *variadic*).

Check notice on line 1 in modules/35-methods-using/300-variadic-parameters/ru/README.md

View workflow job for this annotation

GitHub Actions / LanguageTool

[LanguageTool] modules/35-methods-using/300-variadic-parameters/ru/README.md#L1

Unpaired symbol: ‘"’ seems to be missing (EN_UNPAIRED_QUOTES) URL: https://languagetool.org/insights/post/punctuation-guide/#what-are-parentheses Rule: https://community.languagetool.org/rule/show/EN_UNPAIRED_QUOTES?lang=en-US Category: PUNCTUATION
Raw output
modules/35-methods-using/300-variadic-parameters/ru/README.md:1:534: Unpaired symbol: ‘"’ seems to be missing (EN_UNPAIRED_QUOTES)
 URL: https://languagetool.org/insights/post/punctuation-guide/#what-are-parentheses 
 Rule: https://community.languagetool.org/rule/show/EN_UNPAIRED_QUOTES?lang=en-US
 Category: PUNCTUATION

Хороший пример — метод `String.join()`. Он соединяет строки через разделитель, и количество соединяемых строк может быть любым:

Check notice on line 3 in modules/35-methods-using/300-variadic-parameters/ru/README.md

View workflow job for this annotation

GitHub Actions / LanguageTool

[LanguageTool] modules/35-methods-using/300-variadic-parameters/ru/README.md#L3

Unpaired symbol: ‘"’ seems to be missing (EN_UNPAIRED_QUOTES) URL: https://languagetool.org/insights/post/punctuation-guide/#what-are-parentheses Rule: https://community.languagetool.org/rule/show/EN_UNPAIRED_QUOTES?lang=en-US Category: PUNCTUATION
Raw output
modules/35-methods-using/300-variadic-parameters/ru/README.md:3:1: Unpaired symbol: ‘"’ seems to be missing (EN_UNPAIRED_QUOTES)
 URL: https://languagetool.org/insights/post/punctuation-guide/#what-are-parentheses 
 Rule: https://community.languagetool.org/rule/show/EN_UNPAIRED_QUOTES?lang=en-US
 Category: PUNCTUATION

```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()` под каждое количество строк — достаточно одного метода, который примет их сколько угодно. Это убирает дублирование и упрощает работу со стандартной библиотекой: огромное число её методов рассчитано именно на переменное число аргументов.
12 changes: 12 additions & 0 deletions modules/35-methods-using/300-variadic-parameters/ru/data.yml
Original file line number Diff line number Diff line change
@@ -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`.
Loading