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

15 浏览
0 Comments

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

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

enum Protocol { HTTP, HTTPS, FTP }

还是

enum Protocols { HTTP, HTTPS, FTP }

我知道在.NET世界中,建议使用单数形式,除非枚举代表位标志。只是好奇在Java中是否有类似的建议。

一个相关的问题似乎只适用于.NET:枚举使用单数还是复数形式?

0
0 Comments

在Java中,枚举类型的命名应该使用单数形式还是复数形式?这个问题的出现是因为在定义数据库中的表名或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中,"flags"枚举只是表示当你将枚举作为参数时,你实际上得到的是该枚举的一个元素列表(以整数形式存储)。

你可以在Java中做同样的事情,但枚举仍然是单数形式:

// 定义一个带有FlagsAttribute的枚举。
[FlagsAttribute] 
enum MultiHue : short
{
    Black = 0,
    Red = 1,
    Green = 2,
    Blue = 4
};
public void setMultiHue(MultiHue hues);

用Java更简单、更清晰的方法(虽然它使用了更多的内存)是使用List。实际上,更好的方法是使用EnumSet,它封装了BitSet并为你处理所有这些。 🙂

0
0 Comments

在Java中,枚举(enums)应该是单数形式的,这是因为你选择的不是多个协议(Protocols),而是在值列表中的可能选择中的一个协议(Protocol)。

微软似乎对.NET编程也持有类似的观点。

然而,为什么TimeUnit使用复数形式的呢?例如:DAYS,HOURS...

原因是枚举的值是复数形式的,而枚举本身是单数形式的。

解决方法:按照Java和.NET的约定,枚举应该使用单数形式。但是如果枚举的值本身是复数形式的,可以使用复数形式命名。

0