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

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

Java-разработчик 🧩
567
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 Ссылки

Еще по теме

Гибкое журналирование с помощью log4j

Log4j – это инструмент для журналирования с открытым исходным кодом, разработанный под эгидой глобального проекта Jakarta Apache. Он представляет собой набор API с помощью которых, разработчики могут вставлять в свой код выражения, которые выводят некоторую информацию (отладочную, информационную, сообщения об ошибках и т.д.), и конфигурировать этот вывод с помощью внешний конфигурационных файлов. В этой статье рассматриваются основные идеи, положенные в данный инструмент, а также будут затронуты некоторые интересные моменты, касающиеся написания демонстрационного web-приложения.

Аннотации в Java (java annotation types). Пример 1

Продолжаю серию статей о нововведениях в Java (начиная с версии 1.5). На этот раз разговор пойдет об аннотациях (annotation type).

Указатели и виртуальные функции в Java

В настоящее время в Интернете можно найти множество статей как о перспективности платформы Java, так и об её ограниченности. Многих программистов, только присматривающихся к Яве, могут отпугнуть частые заявления, типа: «низкое быстродействие», «отсутствие указателей» и т.д.

Блокировки

Одной из популярных функциональных возможностей библиотек J2SE 5.0 является добавление средств обеспечения параллельной работы. Предоставленные как часть JSR 166 эти средства обеспечивают развитые возможности программирования параллельных процессов, устраняющие необходимость использования разработчиками ключевого слова synchronized и связанных с ним блокировок. Среди предлагаемых ими функциональных возможностей присутствуют: поддержка блокировочных таймаутов, множественные переменные условия для одной блокировки, блокировки чтения/записи и способность прерывать поток, ожидающий снятия блокировки. Более подробную информацию по дополнительной поддержке блокировок можно найти в документации по пакету java.util.concurrent.locks.