Java数组命名约定:String[] args vs. String args[]

23

我目前作为一名编程导师正在教授学生编程约定。我告诉他们,他们可以在Oracle Code Conventions中找到大多数约定。

在我的最后一个教程中,有个学生问:

public static void main(String args[])
或者
public static void main(String[] args)

如果有惯例或存在差异,则会写成第二种表述方式。我以前从未见过第一种版本,因此非常确定第二种是一种惯例。但我没有来源证明这一点。

你能给我一个来源(最好是来自Oracle的,就像我上面链接的页面)来明确说明哪个是惯例吗?

两种表达式的等价性

我知道这两种表达式是等价的:

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[][];

但是这对于惯例问题没有帮助。

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


2
顺便说一下,我通常使用 public static void main(String... args) ;) - Peter Lawrey
1
@JBNizet,OP询问的是惯例而不是正确的语法。 - Puce
1
@assylias 不,我不认为这是链接问题的重复。 - Puce
1
@Puce:如果两种语法都是正确的,但每个人只使用一种被接受的语法,那么这就是事实上的惯例,不是吗?这就是惯例的定义。 - JB Nizet
1
@brimborium: 来自http://dictionary.reference.com/browse/convention的定义:*5.一种通过使用建立起来的规则、方法或惯例*。每个人都*使用*这种符号表示法,因此它是一种惯例。 - JB Nizet
显示剩余5条评论
4个回答

20

这不是来自Oracle,但我认为它会有所帮助。

这是来自Kathy Sierra的书 SCJP Sun Certified Programmer for Java 6

int[] key;
int key [];

在声明数组引用时,应该总是将数组方括号紧跟在已声明的类型后面,而不是在标识符(变量名称)后面。这样,阅读代码的任何人都可以轻松地知道,例如,key 是一个 int 数组对象的引用,而不是 int 原始类型。


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

2
Oracle的代码规范没有明确说明,但在所有示例中,它们都在声明类型后立即使用方括号。
在他们的示例代码中(在此上下文中应被视为权威),他们使用了: private Object[] instanceVar3;
另外,在变量初始化页面上,他们有一个示例,演示了将方括号放在变量名后面可能导致的问题:
int foo, fooarray[]; //WRONG!
人们可能会被诱惑这样做,并认为自己正在声明多个数组。虽然这在语法上是正确的(正如评论中所指出的那样),但 Oracle 没有无缘无故地在那里放大写字母。最好安全、清晰并且少打几个字,将方括号放在类型后面,以清楚地显示您要声明的内容。

“错误的语法”是什么意思?编译器没有问题...否则这是一个很好的答案。 - brimborium
1
@brimborium:感谢您指出这一点,我已经更正了答案。我之前的假设是错误的,因为Oracle添加了评论。 - titusn
你是对的,//WRONG! 是误导性的。它应该是 //AVOID! 或类似的内容。 - brimborium

0

晚括号有一个不太常见的用例:

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

这个有多有用,我让读者来评判。


0
使用数组类型后紧接着的[]的一个优点是: 如果您想声明多个数组,那么您需要编写类似以下的代码: int[] a,b,c; 但是如果您在数组变量名之后使用[],则必须在每个数组变量后使用[],例如: int a[],b[],c[];

另一方面,Sun风格指南建议不要使用多个声明。 - Stephen C
1
@StephenC,你能给个风格指南的链接吗?那会很有帮助。 - brimborium

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接