Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Varargs


В прошлых выпусках, метод, который взял произвольное число значений, требуемых Вы, чтобы создать массив и поместить значения в массив до вызова метода. Например, вот то, как один использовал MessageFormat класс, чтобы отформатировать сообщение:
Object[] arguments = {
    new Integer(7),
    new Date(),
    "a disturbance in the Force"
};

String result = MessageFormat.format(
    "At {1,time} on {1,date}, there was {2} on planet "
     + "{0,number,integer}.", arguments);

Это все еще истинно, что многократные параметры нужно передать в массиве, но varargs функция автоматизирует и скрывает процесс. Кроме того это совместимо снизу вверх с существующими ранее API. Так, например, MessageFormat.format у метода теперь есть это объявление:

    public static String format(String pattern,
                                Object... arguments);

Эти три периода после типа заключительного параметра указывают, что заключительный параметр можно передать как массив или как последовательность параметров. Varargs может использоваться только в заключительной позиции параметра. Учитывая новое varargs объявление для MessageFormat.format, вышеупомянутый вызов может быть заменен следующим короче и более сладким вызовом:

String result = MessageFormat.format(
    "At {1,time} on {1,date}, there was {2} on planet "
    + "{0,number,integer}.",
    7, new Date(), "a disturbance in the Force");

Есть сильные совместные действия между автоупаковкой и varargs, который иллюстрируется в следующей программе, используя отражение:

// Simple test framework
public class Test {
    public static void main(String[] args) {
        int passed = 0;
        int failed = 0;
        for (String className : args) {
            try {
                Class c = Class.forName(className);
                c.getMethod("test").invoke(c.newInstance());
                passed++;
            } catch (Exception ex) {
                System.out.printf("%s failed: %s%n", className, ex);
                failed++;
            }
        }
        System.out.printf("passed=%d; failed=%d%n", passed, failed);
    }
}

Эта небольшая программа является полным, если минимальный, тестовой платформой. Это берет список имен классов на командной строке. Для каждого имени класса это инстанцирует класса, используя его parameterless конструктора и вызывает parameterless метод, названный тестом. Если инстанцирование или вызов выдают исключение, тест, как считают, перестал работать. Программа печатает каждый отказ, сопровождаемый сводкой результатов испытаний. Отражающее инстанцирование и вызов больше не требуют явного создания массива, потому что getMethod и invoke методы принимают переменный список параметров. Программа также использует новое printf средство, которое полагается на varargs. Программа читает намного более естественно, чем она была бы без varargs.

Так, когда следует использовать varargs? Как клиент, следует использовать в своих интересах их всякий раз, когда API предлагает им. Важное использование в базовых API включает отражение, форматирование сообщения, и новое printf средство. Как разработчик API, следует использовать их экономно, только когда преимущество действительно неотразимо. Вообще говоря, недопустимо перегрузить varargs метод, или для программистов будет трудно выяснить, какую перегрузку вызывают.


Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами