编码约定 - 命名枚举

问题

是否存在在Java中命名枚举的约定?

我的偏好是枚举是一种类型。所以,例如,你有一个枚举

Fruit{Apple,Orange,Banana,Pear, ... }

NetworkConnectionType{LAN,Data_3g,Data_4g, ... }

我反对命名它:

FruitEnum
NetworkConnectionTypeEnum

我知道很容易找出哪些文件是枚举,但是你也可以:

NetworkConnectionClass
FruitClass

另外,是否有一个好的文档描述了常量,在哪里声明它们等等?


#1 热门回答(357 赞)

枚举是类,应遵循类的约定。枚举的实例是常量,应遵循常量的约定。所以

enum Fruit {APPLE, ORANGE, BANANA, PEAR};

没有理由编写FruitEnum而不是FruitClass。你只是在浪费四个(或五个)字符而不添加任何信息。

Java本身推荐这种方法,它是used in their examples


#2 热门回答(63 赞)

这可能不会让我成为很多新朋友,但应该补充说C#人有不同的指导方针:枚举实例是"Pascal case"(大小写混合)。 Seestackoverflow discussionandMSDN Enumeration Type Naming Guidelines

当我们与C#系统交换数据时,我很想完全复制它们的枚举,而忽略了Java的"常量具有大写名称"约定。考虑到这一点,我认为枚举实例限制为大写没有多大价值。出于某些目的,.name()是获取枚举常量的可读表示的便捷快捷方式,并且混合大小写的名称看起来更好。

所以,是的,我敢于质疑Java枚举命名约定的价值。 "编程世界的另一半"确实使用了不同的风格这一事实使我认为怀疑我们自己的宗教是合法的。


#3 热门回答(14 赞)

如前所述,根据Oracle网站(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)上的文档,枚举实例应为大写。

但是,在查看Oracle网站上的JavaEE7教程(http://www.oracle.com/technetwork/java/javaee/downloads/index.html)时,我偶然发现了"Duke的书店"教程和类(tutorial\examples\case-studies\dukes-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;
    }
}

因此,即便是甲骨文的人们有时也会以方便的方式进行交易。