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

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

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

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

我反对将其命名为:

FruitEnum
NetworkConnectionTypeEnum

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

NetworkConnectionClass
FruitClass

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


当前回答

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

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

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

其他回答

如果我可以添加我的$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中已经被广泛使用了,但它并不令人困惑,只是有点不合时宜。

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 }
}

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

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

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

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

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

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

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

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

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

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

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

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

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