Переменное число аргументов методов языка Java

Переменное число аргументов методов языка JavaИногда оказываются полезными методы, способные принимать переменное чис­ло аргументов.

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

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

До версии J2SE5 для поддержки списков аргументов переменной длины применя­лись два способа, ни один из которых не был особенно удобен.

Во-первых, если макси­мально возможное количество аргументов было невелико и заранее известно, то можно было создавать перегруженные версии метода - по одной для каждого способа его вы­зова. Очевидно, что такой подход применим лишь в отдельных случаях.

И во-вторых, если таких версий требовалось создавать слишком много или их максимальное коли­чество было неопределенным, то применялся второй подход: параметры помещались в массив, а затем этот массив передавался методу.

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

Такое решение было предложено в JDK 5. Новое средство, которое позволило изба­виться от явного формирования массива аргументов перед вызовом метода, получило название varargs (сокращение от variable-length arguments - список аргументов перемен­ной длины).

Соответствующие методы называют методами с переменным числом аргу­ментов (другое название - методы переменной арности). В методах этого типа список параметров имеет не фиксированную, а переменную длину, что обеспечивает дополни­тельную гибкость, позволяя методам принимать произвольное число аргументов.

Пользуюсь случаем, хочу спросить аудиторию: работали ли вы когда-то с WordPress-ом? Очень нужен шаблон ThemeForest Motors, уж очень сильно он подойдет для одного моего проекта. Могу отблагодарить материально.

Использование методов с переменным числом аргументов

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

//  vaTest()    
//       

static void vaTest(int ... v) {
    System.out.println(" : " + v.length);
    System.out.println(": ");

    for(int i = 0; i < v.length; i++) {
        System.out.println(" arg " + i + ": " + v[i]);
    }
    System.out.println();
}

Обратите внимание на синтаксис объявления параметра v:

int ... v

Это объявление сообщает компилятору, что метод vaTest() может вызываться с ука­занием произвольного количества аргументов, в том числе и вовсе без них.

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

Ниже приведен полный исходный код примера программы, которая демонстрирует использование метода vaTest().

//       

class VarArgs {

    //  vaTest()    
    static void vaTest(int ... v) {
        System.out.println(" : " + v.length);
        System.out.println(": ");

        for(int i = 0; i < v.length; i++) {
            System.out.println(" arg " + i + ": " + v[i]);
        }
        System.out.println();
    }

    public static void main(String args[]) {
    
        //  vaTest()   
        //   
        vaTest(1);        // 1 
        vaTest(1, 2, 3);  // 3 
        vaTest();         //  


    }

}

Выполнение этой программы дает следующий результат.

 : 1
:
arg 0: 10

 : 1
:
arg 0: 1
arg 1: 2
arg 2: 3

 : 0
:

В приведенной выше программе обращает на себя внимание следующее.

Во-первых, как пояснялось выше, обращение к параметру v в методе vaTest() осуществляется как к массиву. Дело в том, что он действительно является массивом (и, таким образом, может иметь переменную длину).

Многоточие в объявлении этого метода указывает компиля­тору на использование переменного числа аргументов, а также на необходимость поме­стить их в массив v.

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

Помимо списка параметров переменной длины, в объявлении метода могут указы­ваться и обычные параметры, но при одном условии: массив параметров переменной длины должен быть указан последним. Например, приведенное ниже объявление мето­да является вполне допустимым.

int doIt(int a, int b, doublce c, int ... vals) {
    //  
}

В этом случае первым трем аргументам, указанным при вызове метода doIt(), будут соответствовать первые три параметра в объявлении метода, тогда как остальные аргу­менты будут приниматься из массива vals.

Ниже приведен переработанный вариант метода vaTest(), в котором метод получает как обычные аргументы, так и массив аргументов переменной длины.

//     
//    
class VarArgs2 {

    //  msg -  ,
    //   v -    

    //         
    static void vaTest(String msg, int ... v) {
        System.out.println(msg + v.length);
        System.out.println(": ");

        for(int i = 0; i < v.length; i++) {
            System.out.println(" arg " + i + ": " + v[i]);
        }
        System.out.println();
    }

    public static void main(String args[]) {
        vaTest("   : ", 10);
        vaTest("   : ", 1, 2, 3);
        vaTest("    : ");
    }

}

Выполнение этого фрагмента кода дает следующий результат.

   : 1
:
arg 0: 10

   : 3
:
arg 0: 1
arg 1: 2
arg 2: 3

   : 0
:

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

int doIt(int a, int b, double c, int ... vals, boolean stopFlag) {
    // !!!
}

В данном примере сделана попытка указать обычный параметр после списка параме­тров переменной длины.

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

int doIt(int a, int b, double c, int ... vals, double ... morevals) {
    // 
}

Ошибкой в данном случае является попытка указать два разных списка параметров переменной длины.

Интересное видео для читателей нашего блога о Java:

Комментариев 2 на “Переменное число аргументов методов языка Java

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *