Соглашение Java-массива: String [] args vs. String args []
В настоящее время я преподаю студентам в качестве программ обучения преподавателей. Я сказал им, что они могут найти большинство соглашений в соглашениях Oracle Code.
В моем последнем уроке студент спросил, есть ли:
public static void main(String args[])
или
public static void main(String[] args)
записывается по соглашению или если есть разница. Я никогда раньше не видел первую версию, поэтому я очень уверен, что вторая - это конвенция. Но у меня нет источника для этого.
Можете ли вы дать мне источник (желательно из оракула, например, страницы, с которой я связан выше), которая ясно показывает, какой из них является конвенцией?
Эквивалентность обоих выражений
Я знаю, что оба выражения эквивалентны:
JLS 7, с. 292:
An array type is written as the name of an element type followed
by some number of empty pairs of square brackets [].
но также и на стр. 293:
The [] may appear as part of the type at the beginning of the declaration,
or as part of the declarator for a particular variable, or both.
For example:
byte[] rowvector, colvector, matrix[];
This declaration is equivalent to:
byte rowvector[], colvector[], matrix[][];
Но это не помогает для соглашения-quesiton.
Таким образом, они идентичны (не спецификации, но вот источник).
Они производят один и тот же байт-код в небольшом примере, поэтому я очень уверен, что они также идентичны в практике.
Ответы
Ответ 1
Это не от Oracle, но я думаю, что это поможет.
Это из книги Кэти Сьерри SCJP Sun Certified Programmer для Java 6
int[] key;
int key [];
При объявлении ссылки массива вы всегда должны помещать скобки массива
сразу после объявленного типа, а не после идентификатора (переменная
имя). Таким образом, любой, кто читает код, может легко сказать, что, например, ключ является
ссылка на объект массива int, а не на примитив int.
Ответ 2
Соглашения Oracle Code явно не заявляют об этом, но во всех примерах они используют скобки сразу после объявленного типа.
В своем примере кода (который должен считаться авторитетным в этом контексте) они используют:
private Object[] instanceVar3;
Также на странице с детализацией инициализации переменных у них есть этот пример, который демонстрирует возможные проблемы размещения скобок за именем переменной:
int foo, fooarray[]; //WRONG!
Можно попытаться сделать это и подумать, что один из них объявляет несколько массивов. Althoug это синтаксически корректно (как указывал Бримборий в комментариях), Oracle не вкладывала в него заглавные буквы. Лучше быть в безопасности, чистить, а также печатать меньше, помещая скобки за типом, чтобы четко показать, что вы хотите объявить.
Ответ 3
Существует один непонятный вариант использования для поздних скобок:
int x, xs[], xxs[][];
Насколько это полезно, я позволяю читателю быть судьей.
Ответ 4
Одно из преимуществ использования [] сразу после типа массива:
Если вы хотите объявить несколько массивов, тогда вы должны написать:
int [] a, b, c;
Но если вы используете [] после имени массива, тогда мы должны использовать [] после каждой переменной массива:
int a [], b [], c [];