Java 编码约定-命名枚举

Java 编码约定-命名枚举,java,standards,coding-style,Java,Standards,Coding Style,Java中是否有命名枚举的约定 我的偏好是枚举是一种类型。例如,您有一个枚举 Fruit{Apple,Orange,Banana,Pear, ... } NetworkConnectionType{LAN,Data_3g,Data_4g, ... } 我反对把它命名为: FruitEnum NetworkConnectionTypeEnum 我知道很容易确定哪些文件是枚举,但您还需要: NetworkConnectionClass FruitClass 此外,是否有一个好的文档描述常量的

Java中是否有命名枚举的约定

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

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

NetworkConnectionType{LAN,Data_3g,Data_4g, ... }
我反对把它命名为:

FruitEnum
NetworkConnectionTypeEnum
我知道很容易确定哪些文件是枚举,但您还需要:

NetworkConnectionClass
FruitClass

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

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

对于您的水果示例,我们将有一个水果类,其中有一个名为水果的枚举

在代码中引用它如下所示:
Fruit.Fruits.Apple、Fruit.Fruits.Pear

常量沿着同一条线,它们要么在与其相关的类中定义(比如
Fruit.ORANGE\u BUSHEL\u SIZE
);或者,如果它们在名为“ConstantManager”的类(或等效类;如
ConstantManager.null\u INT
)中应用了系统范围(即INT的等效“null值”)。(旁注;我们所有的常量都是大写的)


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

它们仍然是类型,所以我总是使用与类相同的命名约定

我绝对不赞成在名字中加上“Class”或“Enum”。如果您同时拥有
FrootClass
FrootEnum
,则会出现其他问题,您需要更多描述性名称。我正在考虑哪种代码会同时需要这两种类型,而且似乎应该有一个
Fruit
基类和子类型,而不是枚举。(不过这只是我自己的猜测,你可能会遇到与我想象的不同的情况。)

我能找到的命名常量的最佳参考来自:

如果您选择的名称仅由一个单词组成,请使用所有小写字母拼写该单词。如果它由一个以上的单词组成,则将其后每个单词的第一个字母大写。名称gearRatio和currentGear是此约定的主要示例。如果您的变量存储常量值,例如static final int NUM_GEARS=6,则约定会略有更改,将每个字母大写,并用下划线字符分隔后续单词。按照惯例,下划线字符从不在其他地方使用


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

enum Fruit {APPLE, ORANGE, BANANA, PEAR};
没有理由像编写FrootClass那样编写FrootEnum。你只是浪费了四(或五)个字符,没有添加任何信息


Java本身也推荐这种方法,事实确实如此。

这可能不会让我结交很多新朋友,但应该补充的是,C#人有不同的指导原则:枚举实例是“Pascal case”(大写/小写混合)。见和

当我们与C#系统交换数据时,我试图准确地复制它们的枚举,忽略Java的“常量具有大写名称”约定。仔细想想,我看不出enum实例限制为大写有多大价值。出于某些目的,.name()是一个方便的快捷方式,可以获取枚举常量的可读表示形式,混合大小写名称看起来会更好


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

正如前面所述,根据Oracle网站()上的文档,枚举实例应该是大写的

然而,在Oracle网站()上浏览JavaEE7教程时,我偶然发现了“杜克书店”教程,在一个类中(
tutorial\examples\case studies\dukes bookstore\src\main\java\javaeetutorial\dukes bookstore\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;
    }
}
所以看起来,即使是甲骨文公司的员工有时也会很方便地参加会议

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

因此,我猜all caps更准确,但我仍然使用类名约定,因为我讨厌任何地方的all caps

如果我可以添加$0.02,我更喜欢使用PascalCase作为C中的枚举值

在C语言中,它们基本上是全局性的,与PeerConnected相比,PEER_CONNECTED变得非常累人

呼吸新鲜空气

实际上,它让我呼吸更轻松

在Java中,只要从另一个类静态导入原始枚举名,就可以使用原始枚举名

import static pkg.EnumClass.*;
现在,您可以使用已以不同方式限定的非限定名称

我目前(正在考虑)将一些C代码移植到Java中,目前在选择Java约定(更冗长、更冗长、更难看)和我的C风格之间“左右为难”

PeerConnected将成为PeerState.CONNECTED,除非在switch语句中连接它

现在对于后一种约定有很多话要说,它看起来确实不错,但某些“惯用短语”如
if(s==PeerAvailable)
变得像
if(s==PeerState.AVAILABLE)
,怀旧地说,这对我来说是一种意义的丧失

我想我还是更喜欢Java风格,因为它清晰易懂,但我很难看到令人尖叫的代码


现在我意识到PascalCase已经在Java中广泛使用,但它并不是真的很令人困惑,只是有点不合适。

我想补充一点,现在似乎对象工厂是用复数命名的,例如
列表
映射
。在我看来,这是一个很好的惯例,我完全支持它更广泛的使用。是的,它们类似于我的个人编码标准,但不同于我的工作场所编码标准。我们没有太多的工作标准,所以我试图找到一个好的文档来使用