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

fri*_*mle 168 java enums naming-conventions

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

enum Protocol { HTTP, HTTPS, FTP }
Run Code Online (Sandbox Code Playgroud)

要么

enum Protocols { HTTP, HTTPS, FTP }
Run Code Online (Sandbox Code Playgroud)

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

一个相似的问题似乎是.Net特定的:枚举的单数或复数?

Avr*_*ore 204

Java中的枚举(以及一般的枚举)应该是单数的.您的想法是,您不是选择多个协议,而是选择值列表中可能选择的一个协议.

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

  • 这些值是复数,枚举本身不是:-) (10认同)
  • 微软似乎对.NET编程持有大致相同的观点:http://stackoverflow.com/a/1336012/279112 (2认同)

Jos*_*ero 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;
}
}
Run Code Online (Sandbox Code Playgroud)

以单数形式,您可以清楚地看到日属性的意图."day"是这个约会即将举行的那一天.否则,该方法的签名将是setDay(Days days),并且肯定会有很多人想知道约会是否可能在一天以上发生.

如果你在一家公司工作,有48小时轮班你可以尝试定义如下:

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以设定你上班的日子.但它仍然看起来很奇怪,有一个更好的选择,并使用单数形式:

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}
Run Code Online (Sandbox Code Playgroud)

现在你真的显示了枚举的含义.通常在任何域中,您将发现使用单数作为枚举是最佳选项,因为枚举中的每个常量只是一个元素.

你还提到了.NET..NET中的"flags"枚举只是意味着当你期望enum作为参数时,你真正得到的是该枚举的元素列表(存储为整数).

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

public void setMultiHue(MultiHue hues);
Run Code Online (Sandbox Code Playgroud)

您可以在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;
}
}
Run Code Online (Sandbox Code Playgroud)

使用Java更简单,更清晰(尽管使用更多内存)只是使用List.

  • 实际上,更好的方法是使用EnumSet封装BitSet并为您处理所有这些.:-) (2认同)