Java Урок 32: КЛАСС, список аргументов переменной длины

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

Скачать исходники для статьи можно ниже

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

До версии J2SE 5 обработка списка аргументов переменной длины могла
выполняться двумя способами, ни один из которых не был особенно удобен.
Во-первых, если максимальное количество аргументов было небольшим и известным, можно было создавать перегруженные версии метода — по одной для каждого возможного способа вызова метода. Хотя этот способ и приемлем, но применим только в редких случаях.
Во-вторых, когда максимальное количество возможных аргументов было большим или неизвестным, применялся подход, при котором аргументы сначала помещались в массив, а затем массив передавался методу. Следующая программа иллюстрирует этот подход.

// Использование массива для передачи методу переменного
// количества аргументов. Это старый стиль подхода
// к обработке списка аргументов переменной длины,
class PassArray {
   static void vaTest(int v[]) {
      System.out.print("Количество аргументов: " + v.length +
      " Содержимое: ") ;
      for(int x : v)
      System.out.print(x + " ");
      System.out.println();
   }
   public static void main(String args[]){
      // Обратите внимание на способ создания массива
      // для хранения аргументов.
      int n1[] = { 10 } ;
      int n2[] = { 1, 2 , 3 };
      int n3[] = { } ;
      vaTest(nl); // 1 аргумент
      vaTest(n2); // 3 аргумента
      vaTest(n3); // без аргументов
   }
}

Эта программа создает следующий вывод.
Количество аргументов: 1 Содержимое: 10
Количество аргументов: 3 Содержимое: 1 2 3
Количество аргументов: 0 Содержимое:

В программе методу vaTest() аргументы передаются через массив v. Этот старый подход к обработке списка аргументов переменной длины позволяет методу vaTest() принимать любое количество аргументов.
Однако он требует, чтобы эти аргументы были вручную помещены в массив до вызова метода vaTest().
Создание массива при каждом вызове метода vaTest() — задача не только трудоемкая, но и чревата ошибками. Возможность использования методов с переменным количеством аргументов обеспечивает более простой и эффективный подход.
Для указания списка аргументов переменной длины используют три точки (. . .).
Например, вот как метод vaTest () можно записать с использованием списка аргументов переменной длины.

static void vaTest(int ... v) {

Эта синтаксическая конструкция указывает компилятору, что метод vaTest() может вызываться без аргументов или с несколькими аргументами.
В результате массив v неявно объявляется как массив типа int[ ]. Таким образом, внутри метода vaTest() доступ к массиву v осуществляется с использованием синтаксиса обычного массива.
Предыдущая программа с применением метода с переменным количеством аргументов приобретает следующий вид.

// Демонстрация использования списка аргументов переменной длины,
class VarArgs {
   // теперь vaTest() использует список аргументов переменной длины,
   static void vaTest(int ... v) {
      System.out.print("Количество аргументов: " + v.length +
      " Содержимое: ");
      for(int x : v)
      System.out.print(x + " ");
      System.out.println();
   }
   public static void main(String args[]){
      // Обратите внимание на возможные способы вызова
      // vaTest() с переменным количеством аргументов.
      vaTest(10); // 1 аргумент
      vaTest(1, 2, 3); // 3 аргумента
      vaTest(); // без аргументов
   }
}

Вывод этой программы совпадает с выводом исходной версии.
Отметим две важные особенности этой программы.
Во-первых, как уже было сказано, внутри метода vaTest() переменная v действует как массив. Это обусловлено тем, что переменная v является массивом. Синтаксическая конструкция . . . просто указывает компилятору, что метод будет использовать переменное количество аргументов, и, что эти аргументы будут храниться в массиве, на который
ссылается переменная v.
Во-вторых, в методе main() метод vaTest() вызывается с различным количеством аргументов, в том числе и вовсе без аргументов. Аргументы
автоматически помещаются в массив и передаются переменной v. В случае отсутствия аргументов длина массива равна нулю.

Наряду с параметром с переменным количеством аргументов массив может
содержать “нормальные” параметры. Однако параметр с переменным количеством аргументов должен быть последним параметром, объявленным методом.
Например, следующее объявление метода вполне допустимо:

int dolt(int a, int b, double с, int ... vals) {

В данном случае первые три аргумента, указанные в обращении к методу
dolt(), соответствуют первым трем параметрам. Все остальные аргументы считаются принадлежащими параметру vals.

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

Например,следующее объявление также неверно.

int dolt(int a, int b, double с,
int ... vals, double ... morevals) { // Ошибка!

Попытка объявления второго параметра с переменным количеством аргументов недопустима.
Рассмотрим измененную версию метода vaTest(), которая принимает обычный аргумент и список аргументов переменной длины.

// Использование списка аргументов переменной длины совместно
//со стандартными аргументами,
class VarArgs2 {
   //В этом примере msg — обычный параметр,
   // a v — параметр vararg.
   static void vaTest(String msg, int ... v) {
      System.out.print(msg + v.length +
      " Содержимое: ");
      for(int x : v)
      System.out.print(x + " ");
      System.out.println() ;
   }
   public static void main(String args[]){
      vaTest("Один параметр vararg: ", 10);
      vaTest("Три параметра vararg: ", 1, 2, 3);
      vaTest("Без параметров vararg: ");
   }
}

Вывод этой программы таков:
Один параметр vararg: 1 Содержимое: 10
Три параметра vararg: 3 Содержимое: 1 2 3
Без параметров vararg: 0 Содержимое:

Введите свой email адрес для того, чтобы подписаться на мой блог:


knopkisoc

Добавить комментарий