Рассмотрим следующие сигнатуры методов:массивы объектов в сигнатур метода
public fooMethod (Foo[] foos) { /*...*/ }
и
public fooMethod (Foo... foos) { /*...*/ }
Пояснение: Первый принимает массив Foo-объектов в качестве аргумента - fooMethod(new Foo[]{..})
- в то время как последний принимает произвольное количество аргументов типа Foo и представляет их как массив Foo: s внутри метода - fooMethod(fooObject1, fooObject2, etc...
).
Java выбрасывает подгонку, если оба определены, утверждая, что они являются дублирующими методами. Я проделал какую-то детективную работу и выяснил, что первая декларация действительно требует явного массива объектов Foo, и это единственный способ вызвать этот метод. Второй способ фактически принимает как произвольное количество аргументов Foo, так и принимает массив объектов Foo.
Итак, вопрос в том, что последний метод кажется более гибким, есть ли причины использовать первый пример, или я пропустил что-то жизненно важное?
Не зная Java, это удар в темноте, но я предполагаю, что первое немного более эффективно, потому что: а) вы, вероятно, будете пропускать только один указатель, и b) вы будете передавая один указатель на смежную часть памяти. – 2008-10-06 12:11:30
@monoxide: Нет, обе формы генерируют эквивалентный байт-код вызова, обе формы требуют создания массива для передачи. – 2008-10-06 12:13:58
Вторая форма - это просто синтаксический сахар для первого. Итак, fooMethod (новый Foo (1), новый Foo (2)) здесь идентичен fooMethod (новый Foo [] {новый Foo (1), новый Foo (2)}) – 2008-10-06 12:14:51