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

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

enum Protocol { HTTP, HTTPS, FTP } 

要么

 enum Protocols { HTTP, HTTPS, FTP } 

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

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

Java中的枚举(也可能是普通的枚举)应该是单数。 这个想法是,你没有select多个协议,而是一个值列表中可能的select的协议。

请注意不存在复数forms: http : //docs.oracle.com/javase/tutorial/java/javaOO/enum.html

就像在数据库中定义一个表名或者在Java中定义一个类时一样,你也可以使用单数来枚举枚举,这也是最好的select。 只要看看你将如何使用它。

我们来写一个例子:

 public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } class Appointment { private Day day; public void setDay(Day day) { this.day = day; } } 

以单数forms,您可以清楚地看到“日”属性的意图。 “一天”是指这一任命即将举行的一周中的哪一天。 否则,方法的签名将被设置为“天(Day days)”,当然很多人会想知道是否可以在一天之内完成预约。

如果你在一个有48小时轮class的公司工作,你可以尝试定义如下的东西:

 public enum Days { MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY } 

这样你可以设定你将要工作的日子。 但它仍然看起来很奇怪,还有一个更好的select,就是使用单数forms:

 public enum Shift { MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY } 

现在你真的显示了枚举的含义。 通常在任何领域,你会发现使用单数枚举是最好的select,因为在枚举中的每个常量只是一个元素。

你也提到.NET。 .NET中的“flags”枚举只是意味着当你期待这个枚举作为参数时,你真正得到的就是这个枚举的元素列表(存储为一个整数)。

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

一个更容易和更清晰的(尽pipe它使用更多的内存)用Java来做这个只是使用一个List。