在Java中有命名枚举的约定吗?
我的偏好是枚举是一种类型。例如,你有一个枚举
Fruit{Apple,Orange,Banana,Pear, ... }
NetworkConnectionType{LAN,Data_3g,Data_4g, ... }
我反对将其命名为:
FruitEnum
NetworkConnectionTypeEnum
我知道这很容易挑选出哪些文件是枚举,但你也会有:
NetworkConnectionClass
FruitClass
此外,是否有一个好的文档描述相同的常量,在哪里声明它们,等等?
如果我可以添加我的$0.02,我更喜欢使用PascalCase作为C中的enum值。
在C语言中,它们基本上是全局的,与PeerConnected相比,PEER_CONNECTED非常累人。
呼吸新鲜空气。
真的,它让我呼吸更轻松。
在Java中,只要从另一个类中静态导入原始enum名称,就可以使用它们。
import static pkg.EnumClass.*;
现在,你可以使用非限定名称,你已经用另一种方式限定了。
我目前(正在考虑)将一些C代码移植到Java,目前在选择Java惯例(更冗长、更冗长、更丑陋)和我的C风格之间“犹豫不决”。
PeerConnected将变成PeerState。CONNECTED, switch语句除外,此处为CONNECTED。
现在对于后一种约定有很多要说的,它确实看起来不错,但某些“惯用短语”,如if (s == PeerAvailable)变成了if (s == PeerState.AVAILABLE),怀旧地说,这对我来说是没有意义的。
我想我仍然更喜欢Java风格,因为它清晰明了,但我很难看到那些令人尖叫的代码。
现在我意识到PascalCase在Java中已经被广泛使用了,但它并不令人困惑,只是有点不合时宜。
如前所述,根据Oracle网站(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)上的文档,枚举实例应该是大写的。
然而,当我在Oracle网站(http://www.oracle.com/technetwork/java/javaee/downloads/index.html)上浏览JavaEE7教程时,我偶然发现了“Duke’sbookstore”教程,在一个类(教程\示例\案例研究\ Duke -bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java)中,我发现了以下枚举定义:
private enum PropertyKeys {
alt, coords, shape, targetImage;
}
根据约定,它应该是这样的:
public enum PropertyKeys {
ALT("alt"), COORDS("coords"), SHAPE("shape"), TARGET_IMAGE("targetImage");
private final String val;
private PropertyKeys(String val) {
this.val = val;
}
@Override
public String toString() {
return val;
}
}
因此,似乎甲骨文公司的人有时也会用方便来交换惯例。
它们仍然是类型,所以我总是使用与类相同的命名约定。
我绝对不赞成在名字中加入“Class”或“Enum”。如果你同时有一个FruitClass和一个FruitEnum,那么就有问题了,你需要更多描述性的名字。我试图思考那种会导致两者都需要的代码,似乎应该有一个带有子类型的Fruit基类,而不是枚举。(不过这只是我自己的猜测,你的情况可能和我想象的不一样。)
我能找到的命名常量的最好参考来自Variables教程:
If the name you choose consists of only one word, spell that word in all lowercase letters. If it consists of more than one word, capitalize the first letter of each subsequent word. The names gearRatio and currentGear are prime examples of this convention. If your variable stores a constant value, such as static final int NUM_GEARS = 6, the convention changes slightly, capitalizing every letter and separating subsequent words with the underscore character. By convention, the underscore character is never used elsewhere.
在我们的代码库中;我们通常在枚举所属的类中声明枚举。
对于你的Fruit例子,我们会有一个Fruit类,里面有一个Enum叫做Fruits。
在代码中引用它是这样的:Fruit.Fruits。苹果,Fruit.Fruits。梨,等等。
常量遵循同样的原则,它们要么在与之相关的类中定义(比如Fruit.ORANGE_BUSHEL_SIZE);或者在名为“ConstantManager”的类中应用系统范围(即int的等效“空值”)(或等效;如ConstantManager.NULL_INT)。(注;所有常量都是大写的)
与往常一样,您的编码标准可能与我的不同;所以YMMV。