221

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

enum Protocol { HTTP, HTTPS, FTP }

或者

enum Protocols { HTTP, HTTPS, FTP }

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

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

4

2 回答 2

264

Java 中的枚举(可能还有一般的枚举)应该是单数的。想法是您没有选择多个协议,而是选择值列表中可能选择的一个协议。

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

于 2013-04-02T04:20:14.440 回答
27

同样,当您在数据库中定义表名或在 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 属性的意图。"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。

于 2013-08-08T07:26:45.180 回答