Главная > Java сниппеты > Методы для работы с переменным количеством аргументов

Тема Зацепин
268

Java-разработчик 🧩
435
1 минуту

Методы для работы с переменным количеством аргументов

Методы для работы с переменным количеством аргументов, позволяют принимать произвольное количество аргументов. До выхода JDK 5.0 для передачи методу произвольного числа аргументов, необходимо было использовать массив объектов. Более того, отсутствовала возможность использования списка аргументов с такими методами, как метод форматирования класса MessageFormat, или с новым методом JDK 5.0 printf класса PrintStream, для добавления дополнительных аргументов к строке форматирования. Старый способ использования списков аргументов описан в совете Using Variable Argument Lists от 4 февраля 2003 года.

Добавлено : 19 Mar 2009, 17:42

В JDK 5.0 добавлен гибкий механизм работы с переменным количеством агрументов. Для изучения возможностей данного механизма, давайте рассмотрим версию метода printf класса PrintStream, используемую в JDK 5.0:

public PrintStream printf(String format, Object... args)

Описание данного метода приводится в совете Formatting Output With the New Formatter, опубликованном в октябре 2004 года.

По умолчанию, первым аргументом данного метода является строка, заполненная символами, определяющими последующие аргументы. Многоточие во втором аргументе показывает, что он может быть представлен в виде массива или последовательности аргументов. Заметьте, что применение символа многоточия аналогично применению данного символа с языках С и С++ для определения списка аргументов.

Количество символов-заполнителей в строке форматирования задает число передаваемых аргументов. Например, строка форматирования: "Hello, %1s\nToday is %2$tB %2$te, %2$tY", требует наличия двух аргументов - первый строкового типа и второй типа дата. Ниже приводится пример использования данного метода:

import java.util.*;

public class Today {
public static void main(String args[]) {
System.out.printf("Hello, %1s%nToday is %2$tB %2$te, %2$tY%n", args[0],
new Date());
}
}

Если в качестве аргумента вы зададите имя, то результат выполнения данного примера будет следующим:

> java Today Ed Hello, Ed Today is October 18, 2005

Автоматическое преобразование типов позволяет вам передвать в качестве аргументов примитивные типы (как в следующем примере метода printf):

System.out.printf("Pi is approximately %f", Math.PI, %n);

В данном примере аргумент Math.PI имеет тип double. Автоматическое преобразование типов переводит его в объект типа Double. (Подробное описание автоматического преобразования типов дается с совете Introduction to Autoboxing от 5 апреля 2005 года).

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

private static void method1(String... args)

Параметр с перемнным числом аргументов не обязательно является единственным, передаваемым методу. Например, следующий метод принимает целочисленный агргумент, а затем пременное число аргументов.

private static void method2(int arg, Object... args)

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

method1("Hello", "World");
method1
(args);
method2
(12, 'a', "Hello", Math.PI, 1/3.0);
method2
(18, 94.0);

Во втором вызове метода есть небольшое отличие. Метод принимает аргумент String[], передаваемый из метода main(). Так как механизм работы с переменным количеством агрументов, неявно является способом для создания и передачи массивов, то с его помощью массив может быть передан напрямую. В данном случае компилятор передает неизмененный массив.

Ниже приводится класс MyArgs, реализующий два типа методов:

import java.util.*;

public class MyArgs {
public static void main(String args[]) {
method1("Hello", "World");
method1
(args);
method2
(12, 'a', "Hello", Math.PI, 1 / 3.0);
method2
(18, 94.0);
}

private static void method1(String... args) {
System.out.println(Arrays.asList(args) + " // " + args.length);
}

private static void method2(int arg, Object... args) {
System.out.println(Arrays.asList(args) + " / " + arg);
}
}

Результат его выполнения буде следующим:

> java MyArgs x y z [Hello, World] // 2 [x, y, z] // 3 [a, Hello, 3.141592653589793, 0.3333333333333333] / 12 [94.0] / 18

Класс MyArgs получает доступ к списку аргументов, передавая его методу Arrays.asList(). То есть, доступ к аргументам производится также как к элементам массива. В обычной практике вы скорее всего будете использовать расшириный цикл for для доступа к аргументам:

for (String arg: args) {
...
}

Данный код позволяет поочередно обрабатывать каждый элемент.

Как видите, механизм работы с переменным количеством агрументов позволяет вам легко сохдавать методы, принимающие пременное количество аргументов. Для более полного ознакомления с данным механизмом обращайтесь к статье Varargs .

Теги: java 5

Еще от автора

Применение WeakHashmap для списков слушателей

В статье от 11мая 1999 года Reference Objects были описаны основные идеи применения ссылочных объектов, но не приводилось детального описания. Данная статья позволит вам получить больше сведений, касающихся данной темы. В основном ссылочные объекты применяются для косвенных ссылок на память необходимую объектам. Ссылочные объекты хранятся в очереди (класс ReferenceQueue), в которой отслеживается доступность ссылочных объектов. Исходя из типа ссылочного объекта, сборщик мусора может освобождать память даже тогда, когда обычные ссылки не могут быть освобождены.

Заставки в Mustang

Согласно определению, данному в Wikipedia, заставка - это компьютерный термин, обозначающий рисунок, появляющийся во время загрузки программы или операционной системы. Заставка для пользователя является визуальным отображением инициализации программы. До выхода версии Java SE 6 (кодовое название Mustang) единственной возможностью применения заставки было создание окна, во время запуска метода main, и размещение в нем картинки. Хотя данный способ и работал, но он требовал полной инициализации исполняемой Java среды до появления окна заставки. При инициализации загружались библиотеки AWT и Swing, таким образом, появление заставки задерживалось. В Mustang появился новый аргумент командной строки, значительно облегчающий использование заставок. Этот способ позволяет выводить заставку значительно быстрее до запуска исполняемой Java среды. Окончательное добавление данной функциональности находится на рассмотрении в JCP.

Совмещение изображений

1 Введение 2 Правила визуализации и пример 3 Совмещение изображений в оперативной памяти 4 Постепенное исчезновение изображения 5 Ссылки и дополнительная информация

Еще по теме

Применение WeakHashmap для списков слушателей

В статье от 11мая 1999 года Reference Objects были описаны основные идеи применения ссылочных объектов, но не приводилось детального описания. Данная статья позволит вам получить больше сведений, касающихся данной темы. В основном ссылочные объекты применяются для косвенных ссылок на память необходимую объектам. Ссылочные объекты хранятся в очереди (класс ReferenceQueue), в которой отслеживается доступность ссылочных объектов. Исходя из типа ссылочного объекта, сборщик мусора может освобождать память даже тогда, когда обычные ссылки не могут быть освобождены.

Заставки в Mustang

Согласно определению, данному в Wikipedia, заставка - это компьютерный термин, обозначающий рисунок, появляющийся во время загрузки программы или операционной системы. Заставка для пользователя является визуальным отображением инициализации программы. До выхода версии Java SE 6 (кодовое название Mustang) единственной возможностью применения заставки было создание окна, во время запуска метода main, и размещение в нем картинки. Хотя данный способ и работал, но он требовал полной инициализации исполняемой Java среды до появления окна заставки. При инициализации загружались библиотеки AWT и Swing, таким образом, появление заставки задерживалось. В Mustang появился новый аргумент командной строки, значительно облегчающий использование заставок. Этот способ позволяет выводить заставку значительно быстрее до запуска исполняемой Java среды. Окончательное добавление данной функциональности находится на рассмотрении в JCP.

Использование потоков

1 Введение 2 Работа с выражениями типа Boolean 3 Класс JoptionPane 4 Приложение-счетчик 5 Ссылки

Перехват необрабатываемых исключений

В статье от 16 марта 2004 года Best Practices in Exception Handling были описаны приемы обработки исключений. В данной статье вы изучите новый способ обработки исключений при помощи класса UncaughtExceptionHandler добавленного в J2SE 5.0.

Использование класса LinkedHashMap

1 Введение 2 Сортировка хэш-таблицы 3 Копирование таблицы 4 Сохранение порядка доступа к элементам 5 Ссылки

Сказ про кодировки и java

С кодировками в java плохо. Т.е., наоборот, все идеально хорошо: внутреннее представление строк – Utf16-BE (и поддержка Unicode была с самых первых дней). Все возможные функции умеют преобразовывать строку из маленького регистра в большой, проверять является ли данный символ буквой или цифрой, выполнять поиск в строке (в том числе с регулярными выражениями) и прочее и прочее. Для этих операций не нужно использовать какие-то посторонние библиотеки вроде привычных для php mbstring или iconv. Как говорится, поддержка многоязычных тестов “есть в коробке”. Так откуда берутся проблемы? Проблемы возникают, как только строки текста пытаются “выбраться” из jvm (операции вывода текста различным потребителям) или наоборот пытаются в эту самую jvm “залезть” (операция чтения данных от некоторого поставщика).