逗号(,)为何不会导致编译错误?

23

我正在编写一段代码,突然发现“,”不会导致任何编译错误。为什么?

我的意思是什么

public enum A {
    B, C, ; // no compilation error
}
但是。
int a, b, ; // compilation error

5
链接?简单回答:你的攻击行为的原因是什么? - user467871
4
这是一个有趣的问题,我从未知道在枚举中多加一个逗号也是可以接受的。 - Reza
Java语法基于C语言家族,就数组而言,据我所知,这也是C语言的做法。 - Hovercraft Full Of Eels
@Reza,这也让我感到惊讶。我遇到过类似的情况,最后还是问了。 - user467871
真正的问题是:为什么在其他情况下,一个尾随逗号必须导致编译错误? - Chris Martin
5
我喜欢它这样做,因为如果你垂直格式化枚举并在末尾留下逗号,那么当有人添加另一个枚举时,它不会影响先前行的提交历史,所以你可以轻松地看到是谁添加了哪些枚举。除此之外,我不知道你还有什么其他原因在末尾加逗号,除非你忘记了或者其他情况。 - Jason Robertson
3个回答

23

Enumbody的规范如下:

{ [EnumConstantList] [,] [EnumBodyDeclarations] } 

如您所见EnumConstantList后面可以有一个可选逗号,这只是一种表示上的方便。


1
唯一可能的不便之处就是在代码审查时,审核人员可能会因为“它既不在JDK中使用,也没有在我们其余的代码中出现”而不喜欢它。 - Vlasec

22

这种设计的语言是为了方便添加和重新排列元素 - 特别是如果每个元素都单独在一行上。

与声明变量相比,这个比喻不太恰当,但数组允许以相同的方式存储更多的值:

int[] foo = { 1, 2, 3, };

基本上,在源代码中定义的集合中添加额外的值比想要将变量添加到声明语句中更为常见。


18

主要优点在于它使得多行列表更易于编辑,并且减少了差异中的杂乱内容。

修改为:

public enum Names{
     MANNY,
     MO,
     JACK,
}

收件人:

public enum Names{
     MANNY,
     MO,
     JACK,
     ROGER,
}

只需要在差异中进行一行更改:

  public enum Names{ 
       MANNY,
       MO,
       JACK,
+      ROGER,
  }

当省略尾随逗号时,这比更令人困惑的多行差异更好:

  public enum Names {
       MANNY,
       MO,
-      JACK
+      JACK,
+      ROGER
  }

后者的差异使得很难看出只添加了一行,而另一行内容没有改变。

根据 Raymond 的回答:https://dev59.com/vmgu5IYBdhLWcg3wFDJr#11597911


你至少应该让代码能够编译。引用的值不是有效的枚举标识符。此外,你忘记在“Manny”后面加逗号了。 - MC Emperor
完全同意,我甚至认为逗号是允许的,正是因为这个原因 :) - RAM237

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