АБОБА. Справочник по программированию на Java Методическое пособие
Скачать 242.41 Kb.
|
Аргументы переменной длиныВ JDK 5 была добавлена новая функциональная возможность, которая упрощает создание методов, принимающих переменное количество аргументов. Эта функциональная возможность получила название varargs (сокращение термина variable-length arguments – аргументы переменной длины). Метод, который принимает переменное число аргументов, называют методом переменной арности, или просто методом varargs. Ситуации, в которых методу нужно передавать переменное количество аргументов, встречаются не так уж редко. Например, метод, который открывает подключение к Internet, может принимать имя пользователя, пароль, имя файла, протокол и тому подобное, но применять значения, заданные по умолчанию, если какие-либо из этих сведений опущены. В этой ситуации было бы удобно передавать только те аргументы, для которых заданные по умолчанию значения не применимы. Еще один пример – метод printf(), входящий в состав библиотеки ввода-вывода Java. // Использование массива для передачи методу переменного // количества аргументов. Это старый стиль подхода // к обработке аргументов переменной длины. 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(n1); // 1 аргумент vaTest(n2); // 3 аргумента vaTest(n3); // без аргументов } } Эта программа создает следующий вывод: Количество аргументов: 1 Содержимое: 10 Количество аргументов: 3 Содержимое: 1 2 3 Количество аргументов: 0 Содержимое: В программе методу vaTest() аргументы передаются через массив v. Этот старый подход к обработке аргументов переменной длины позволяет методу vaTest() принимать любое число аргументов. Однако он требует, чтобы эти аргументы были вручную помещены в массив до вызова метода vaTest(). Создание массива при каждом вызове метода vaTest() не только трудоемкая, но и чреватая ошибками задача. Функциональная возможность использования методов varargs обеспечивает более простой и эффективный подход. Для указания аргумента переменной длины используют три точки (...). Например, вот как метод vaTest() можно записать с использованием аргумента переменной длины: static void vaTest(int ... v) { Эта синтаксическая конструкция указывает компилятору, что метод vaTest() может вызываться с нулем или более аргументов. В результате v неявно объявляется как массив типа int[]. Таким образом, внутри метода vaTest() доступ к v осуществляется с использованием синтаксиса обычного массива. Предыдущая программа с применением метода vararg приобретает следующий вид: // Демонстрация использования аргументов переменной длины. 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(); // без аргументов } } Вывод этой программы совпадает с выводом исходной версии. Наряду с параметром переменной длины массив может содержать “нормальные” параметры. Однако параметр переменной длины должен быть последним параметром, объявленным методом. Существует еще одно ограничение, о котором следует знать: метод должен содержать только одни параметр типа varargs. Метод, который принимает аргумент переменной длины, можно перегружать. // Параметры vararg и перегрузка. class VarArgs3 { static void vaTest(int ... v) { System.out.print("vaTest(int ...): " + "Количество аргументов: " + v.length + " Содержимое: "); for(int x : v) System.out.print(x + " "); System.out.println(); } static void vaTest(boolean ... v) { System.out.print("vaTest(boolean ...) " + "Количество аргументов: " + v.length + " Содержимое: "); for(boolean x : v) System.out.print(x + " "); System.out.println(); } static void vaTest(String msg, int ... v) { System.out.print("vaTest(String, int ...): " + msg + v.length + " Содержимое: "); for(int x : v) System.out.print(x + " "); System.out.println(); } public static void main(String args[]) { vaTest(1, 2, 3); vaTest("Проверка: ", 10, 20); vaTest(true, false, false); } } Эта программа создает следующий вывод: vaTest(int ...): Количество аргументов: 3 Содержимое: 1 2 3 vaTest(String, int ...): Проверка: 2 Содержимое: 10 20 vaTest(boolean ...) Количество аргументов: 3 Содержимое: true false false |