Java中枚举的命名:单数还是复数?


184

是否有关于如何命名Java枚举的“官方”建议?

enum Protocol { HTTP, HTTPS, FTP }

要么

enum Protocols { HTTP, HTTPS, FTP }

我知道在.Net世界中,建议使用单数形式,但表示位标志的枚举除外。只是好奇Java是否有类似的东西。

似乎是.Net的一个相关问题:枚举是单数还是复数?


3
你可以在这里找到答案。枚举是类,这意味着您应该以相同的方式声明它们。
bsiamionau

Answers:


220

Java中的枚举(通常可能是枚举)应为单数。这种想法是,您不是在选择多个协议,而是在值列表中选择一个协议。

注意没有复数形式:http : //docs.oracle.com/javase/tutorial/java/javaOO/enum.html


2
微软似乎对.NET编程持大致相同的观点:stackoverflow.com/a/1336012/279112
Panzercrisis

TimeUnit如何使用复数?例如:DAYSHOURS...
themuv

4
值是复数,枚举本身不是:-)
加尔文(Calvin)

21

与在数据库中定义表名或在Java中定义类的方式相同,对于枚举使用单数形式也是最佳选择。只是看看您将如何使用它。

让我们写一个例子:

public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

class Appointment {
private Day day;

public void setDay(Day day) {
    this.day = day;
}
}

以单数形式,您可以清楚地看到day属性的意图。“日期”是该约会将在一周中的某一天举行。否则,该方法的签名将是setDay(Days day),并且可以肯定,很多人会怀疑约会是否可能在一天之内完成。

如果您在一家公司工作,需要48小时轮班,您可以尝试定义以下内容:

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

这样,您就可以设定要上班的日子。但仍然看起来很奇怪,还有一个更好的选择,那就是使用单数形式:

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

现在,您确实在显示枚举的含义。通常,在任何域中,您都会发现对枚举使用单数形式是最佳选择,因为枚举中的每个常量只是一个元素。

您还提到了.NET。.NET中的“标志”枚举仅表示当您期望该枚举作为参数时,您真正得到的是该枚举的元素列表(存储为整数)。

// Define an Enum with FlagsAttribute.
[FlagsAttribute] 
enum MultiHue : short
{
    Black = 0,
    Red = 1,
    Green = 2,
    Blue = 4
};

public void setMultiHue(MultiHue hues);

您可以在Java中执行相同的操作,但枚举仍然是单数:

public enum Hue {
BLACK, RED, GREEN, BLUE;
private final Integer hue;

Hue() {
    this.hue = 1 << this.ordinal();
}

public Integer toFlag() {
    return this.hue;
}
}

public class MultiHue {
private Integer hues = 0;

public void addHue(Hue hue) {
    this.hues |= hue.toFlag();
}

public boolean hasHue(Hue hue) {
    return (this.hues & hue.toFlag()) != 0;
}
}

使用Java进行此操作更简单,更清晰(尽管它使用更多的内存)只是使用List。


2
实际上,一种更好的方法是使用EnumSet,它封装一个BitSet并为您处理所有这些工作。:-)
corsiKa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.