题 Java数组约定:String [] args与String args []


我目前正在教学生作为导师编程惯例。我告诉他们,他们可以找到大多数的约定 Oracle代码约定

在我上一篇教程中,一名学生询问:

public static void main(String args[])

要么

public static void main(String[] args)

是按惯例书写的,或者是否存在差异。我之前从未见过第一个版本,所以我非常确定第二个版本是一个约定。但我没有这个来源。

你能给我一个来源(最好是来自oracle,就像我上面链接过的页面一样),这清楚地说明了哪一个是常规的?

两种表达方式的等价性

我知道两个表达式都是等价的:

JLS 7,p。 292州:

An array type is written as the name of an element type followed 
by some number of empty pairs of square brackets []. 

而且还在p。 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[][];

但这对于会议问题没有帮助。

所以他们是相同的(不是规格,但这里是一个 资源)。 它们在一个小例子中产生相同的字节码,所以我非常确定它们在实践中也是相同的。


20
2017-11-01 10:31


起源


BTW我经常使用 public static void main(String... args) ;) - Peter Lawrey
@JBNizet OP询问约定而不是正确的语法。 - Puce
@assylias不,我认为这不是链接问题的重复。 - Puce
@Puce:如果两者都是正确的,但每个人只使用一种可接受的语法,那么这是事实上的约定,不是吗?这是一个公约的定义。 - JB Nizet
@brimborium:来自 dictionary.reference.com/browse/convention: 5.由使用建立的规则,方法或实践。每个人 使用 这个符号,所以这是一个惯例。 - JB Nizet


答案:


这不是来自甲骨文,但我认为这会有所帮助。

它来自凯西塞拉的书 SCJP Sun认证Java 6程序员

int[] key;
int key [];

声明数组引用时,应始终放置数组括号 紧接在声明的类型之后,而不是在标识符之后(变量 名称)。这样,任何阅读代码的人都可以很容易地说出,例如,密钥是一个 引用int数组对象,而不是int原语。


19
2017-11-01 10:35



+1,我也认为数组括号属于不是变量名的类型。 - Puce


Oracle的代码约定 没有明确说明它,但在所有示例中,它们在声明的类型之后立即使用括号。

在他们的示例代码中(在此上下文中应该被认为是权威的),他们使用:

private Object[] instanceVar3;

也在 详细说明初始化的页面 他们有这个例子的变量,演示了将括号放在变量名后面的可能问题:

int foo, fooarray[]; //WRONG!

人们可能会想要这样做,并认为有人正在声明几个阵列。虽然这在语法上是正确的(正如评论中指出的brimborium),甲骨文没有把大写字母放在那里。通过将支架放在类型后面以清楚地显示您想要声明的内容,可以更安全,更清晰并且更少打字。


2
2017-11-01 10:40



“错误的语法”是什么意思?编译器没有问题...否则很好的答案。 - brimborium
@brimborium:谢谢你指出这一点,我纠正了答案。我确实认为这是不正确的,因为Oracle添加了评论。 - titusn
你是对的 //WRONG! 是误导。它应该是 //AVOID! 或类似的东西。 - brimborium


对于后期括号,有一个模糊的用例:

int x, xs[], xxs[][];

多少有用,我让读者成为法官。


0
2017-11-01 10:41





在数组类型之后立即使用[]的一个优点是: 如果你想声明多个数组,那么你就像这样写: int [] a,b,c; 但是如果在数组名后面使用[],那么我们必须在每个数组变量之后使用[],如: int a [],b [],c [];


0
2017-11-01 11:01



OTOH - Sun风格指南建议不要使用多个声明。 - Stephen C
@StephenC你能给出那个风格指南的链接吗?这会有所帮助。 - brimborium