Java 编码约定-命名枚举
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 此外,是否有一个好的文档描述常量的
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中广泛使用,但它并不是真的很令人困惑,只是有点不合适。我想补充一点,现在似乎对象工厂是用复数命名的,例如
列表和映射。在我看来,这是一个很好的惯例,我完全支持它更广泛的使用。是的,它们类似于我的个人编码标准,但不同于我的工作场所编码标准。我们没有太多的工作标准,所以我试图找到一个好的文档来使用