Разница между byte [] и byte ... в методах Java - PullRequest
4 голосов
/ 03 октября 2011

Кто-то спросил меня, в чем разница между двумя параметрами метода и почему вы используете ... над специально назначенным массивом.

putMessage(byte ...send)

putMessage(byte[] send)

Я не мог ответить на них с уверенностью и не мог вспомнитькак называется ...

Ответы [ 5 ]

6 голосов
/ 03 октября 2011

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

putMessage(0b00100101, 0b00100101, 0b00100101); // varargs

против. это:

putMessage(new byte[] { 0b00100101, 0b00100101, 0b00100101 }); // array

Первый пример менее загроможден и более читаем.

2 голосов
/ 03 октября 2011

Параметры с эллипсами обычно называются "varargs", если вы хотите, чтобы Google это.

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

public void printStr(String ...strings) {
    for (String s : strings) {
        System.out.println(s);
    }
}

> printStr("Hello", "World")
Hello
World

Таким образом, varargs допускает определенную степень удобства, но есть и недостатки: параметр varargs должен быть последним параметром в сигнатуре метода, и поэтому вы не можете иметь более одного параметра varargs для метода. Если вы хотите передать несколько массивов в метод, вы должны использовать массивы, а не varargs.

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

Преимущество использования varargs в сигнатуре метода заключается в гибкости - в некоторых ситуациях вызывающему в любом случае будет готов массив, а в некоторых - просто несколько аргументов. Varargs примет массив или каждую переменную в качестве отдельного аргумента, что избавит вызывающую программу от необходимости создавать экземпляры и заполнять массив.

1 голос
/ 03 октября 2011

Первый с Varargs .

Короче

A.Первый может использоваться для вызова с однобайтовым типом arg, 2 байтовыми аргументами .. или многими аргументами или массивом.

B.секунда будет использоваться только с массивом.

1 голос
/ 03 октября 2011

Многоточие (три точки) указывает, что вы используете "varargs".

См. http://download.oracle.com/javase/1,5.0/docs/guide/language/varargs.html для получения более подробной информации.

Внутри метода вы получаете доступ к элементам«отправить» как массив.Два метода одинаковы в этом отношении.Удобство для звонящего.Во втором putMessage вызывающая сторона вынуждена создавать массив байтов для передачи в putMessage.В первом putMessage вызывающая сторона может просто сказать «putMessage (byte1, byte2)» или «putMessage (byte1, byte2, byte3)» или «putMessage (byte1)» - переменное число аргументов или переменные.

0 голосов
/ 03 октября 2011

Эллипсы (...) позволяют встроить N параметров типа в вызов функции без необходимости сначала определять массив. В конце концов, вы просто получаете массив параметров, но это в основном сокращение или синтаксический сахар. Кроме того, ваш клиентский код может быть немного чище и более декларативным с синтаксисом эллипсов ... хотя он может легко пойти другим путем и стать грязным и нечитаемым.

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

...