Переменное число аргументов в Java: конструкция "..."

Недавно случайно обнаружил, что в Java существует возможность красиво реализовать переменное число аргументов у метода. Красиво, это значит без всяких new Object[]{}, которые жутко засоряют код и совсем не способствуют его читабельности. Красивое решение: конструкция "...", которая была добавлена в Java SE 5.

Как это использовать?

Суть конструкции проще объяснить на примере. Допустим, мы объявляем метод eval, который должен принимать произвольное число аргументов произвольного типа. Как обычно решается такая задача?
void eval( Object[] args ) { ... }
Но, для того, чтобы вызвать этот метод, приходится оборачивать аргументы в массив:
eval( new Object[]{ 1, 2, 3 } );
Теперь посмотрим, как это будет выглядеть с конструкцией "...":
void eval( Object ... args ) { ... }
И вызовы метода:
eval( 1, 2, 3 );
eval( 2, "Hello world!!!" );
А как изменится при этом тело метода eval? А никак. Внутри метода args по-прежнему является массивом.

Как это работает?

Компилятор, встретив такое объявление метода генерирует байт-код точно так же, как если бы это был простой массив. А при вызове, автоматически вставляет байт-код, который формирует этот массив и передает его в метод. Вот и все.

Где это используется?

Я это нашел в стандартной библиотеке Java. Первым методом, на который я обратил внимание был Collections.addAll, позволяющий добавлять в коллекцию массив, или произвольное число элементов, заданых отдельно. Затем уже я обнаружил метод PrintStream.printf, позволяющий осуществлять форматированный вывод, как в С++.

 Подписаться на RSS

 #  #  #  #  #  #  #  #  #

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