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

2022-09-02 01:40:22

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

在我的上一个教程中,一个学生问:

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

但这对惯例没有帮助。

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


答案 1

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

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

int[] key;
int key [];

声明数组引用时,应始终将数组括号紧跟在声明的类型之后,而不是放在标识符(变量名称)之后。这样,阅读代码的任何人都可以轻松分辨出,例如,key 是对 int 数组对象的引用,而不是 int 基元。


答案 2

Oracle 的代码约定没有明确说明这一点,但在所有示例中,它们都紧跟在声明的类型之后使用括号。

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

private Object[] instanceVar3;

同样在详细介绍变量初始化的页面上,他们有这个例子,演示了将括号放在变量名称后面的可能问题:

int foo, fooarray[]; //WRONG!

人们可能会试图这样做,并认为一个人正在声明几个数组。Althoug这个语法上是正确的(正如brimborium在评论中指出的那样),Oracle并没有把大写字母放在那里。最好是安全,清晰,并且通过在类型后面放置括号来清楚地显示要声明的内容,从而减少键入。