在Java中有命名枚举的约定吗?

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

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

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

我反对将其命名为:

FruitEnum
NetworkConnectionTypeEnum

我知道这很容易挑选出哪些文件是枚举,但你也会有:

NetworkConnectionClass
FruitClass

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


当前回答

这可能不会让我有很多新朋友,但应该补充的是,c#的人有不同的指导方针:枚举实例是“Pascal大小写”(大小写混合)。参见stackoverflow讨论和MSDN枚举类型命名指南。

当我们用c#系统交换数据时,我很想完全复制它们的枚举,忽略了Java的“常量有大写名称”约定。考虑到这一点,我不认为将枚举实例限制为大写有多大价值。出于某些目的,.name()是一种方便的快捷方式,可以获得枚举常量的可读表示,混合大小写名称会更好看。

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

其他回答

这可能不会让我有很多新朋友,但应该补充的是,c#的人有不同的指导方针:枚举实例是“Pascal大小写”(大小写混合)。参见stackoverflow讨论和MSDN枚举类型命名指南。

当我们用c#系统交换数据时,我很想完全复制它们的枚举,忽略了Java的“常量有大写名称”约定。考虑到这一点,我不认为将枚举实例限制为大写有多大价值。出于某些目的,.name()是一种方便的快捷方式,可以获得枚举常量的可读表示,混合大小写名称会更好看。

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

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

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

没有理由写FruitEnum,也没有理由写FruitClass。你只是浪费了四个(或五个)字符,没有添加任何信息。

Java™教程的示例本身推荐并使用了这种方法。

enum MyEnum {VALUE_1,VALUE_2}

(大概)是说

class MyEnum {

    public static final MyEnum VALUE_1 = new MyEnum("VALUE_1");
    public static final MyEnum VALUE_2 = new MyEnum("VALUE_2");

    private final name;

    private MyEnum(String name) {
        this.name = name;
    }

    public String name() { return this.name }
}

所以我猜全大写严格来说更正确,但我仍然使用类名约定,因为我讨厌在任何地方全大写

如前所述,根据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;
    }
}

因此,似乎甲骨文公司的人有时也会用方便来交换惯例。

在我们的代码库中;我们通常在枚举所属的类中声明枚举。

对于你的Fruit例子,我们会有一个Fruit类,里面有一个Enum叫做Fruits。

在代码中引用它是这样的:Fruit.Fruits。苹果,Fruit.Fruits。梨,等等。

常量遵循同样的原则,它们要么在与之相关的类中定义(比如Fruit.ORANGE_BUSHEL_SIZE);或者在名为“ConstantManager”的类中应用系统范围(即int的等效“空值”)(或等效;如ConstantManager.NULL_INT)。(注;所有常量都是大写的)

与往常一样,您的编码标准可能与我的不同;所以YMMV。