Подтвердить что ты не робот

Соглашение 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.

Таким образом, они идентичны (не спецификации, но вот источник). Они производят один и тот же байт-код в небольшом примере, поэтому я очень уверен, что они также идентичны в практике.

4b9b3361

Ответ 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 [];