Spec-Zone .ru
спецификации, руководства, описания, API
|
MessageFormat
class, чтобы отформатировать сообщение: 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");
Есть совместные действия strong между автоупаковкой и 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); } }
Эта небольшая программа является полным, если минимальный, тестовой платформой. Это берет список имен class на командной строке. Для каждого имени class это инстанцирует class, используя его parameterless конструктора и вызывает parameterless метод, названный тестом. Если инстанцирование или вызов выдают исключение, тест, как считают, перестал работать. Программа печатает каждый отказ, сопровождаемый сводкой результатов испытаний. Отражающее инстанцирование и вызов больше не требуют явного создания массива, потому что getMethod
и invoke
методы принимают переменный список параметров. Программа также использует новое
printf
средство, которое полагается на varargs. Программа читает намного более естественно, чем она была бы без varargs.
Так, когда следует использовать varargs? Как клиент, следует использовать в своих интересах их всякий раз, когда API предлагает им. Важное использование в базовых API включает отражение, форматирование сообщения, и новое printf
средство. Как разработчик API, следует использовать их экономно, только когда преимущество действительно неотразимо. Вообще говоря, недопустимо перегрузить varargs метод, или для программистов будет трудно выяснить, какую перегрузку вызывают.