Javaでの列挙型の命名:単数形か複数形か?


184

Java列挙型に名前を付ける方法の「公式」推奨はありますか?

enum Protocol { HTTP, HTTPS, FTP }

または

enum Protocols { HTTP, HTTPS, FTP }

.Netの世界では、ビットフラグを表す列挙型を除き、単数形を使用することをお勧めします。Javaに似たようなものがあるかどうか知りたいだけです。

.Net固有のように思われる関連質問:列挙の単数形または複数形?


3
ここで答えを見つけることができます。列挙型はクラスです。つまり、同じ方法で宣言する必要があります。
bsiamionau 2013

回答:


220

Javaの列挙型(およびおそらく一般的な列挙型)は単数形でなければなりません。考えているのは、複数のプロトコルを選択するのではなく、値のリストで選択可能な1つのプロトコルを選択することです。

複数形がないことに注意してください:http : //docs.oracle.com/javase/tutorial/java/javaOO/enum.html


2
マイクロソフトは、おおよその.NETプログラミングについて同じ意見を保持しているようだ:stackoverflow.com/a/1336012/279112
Panzercrisis

どのように来るTimeUnitでは複数形を使用していますか?例:DAYSHOURS...
theyuv

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

単数形では、日の属性の意図がはっきりとわかります。「日」は、この予定が開催される曜日です。それ以外の場合、メソッドのシグネチャはsetDay(Days day)になり、多くの人が予定が2日以上で発生するかどうか疑問に思うでしょう。

48時間勤務の会社で働いている場合、次のような定義を試みることができます。

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

そうすれば、あなたはあなたが仕事に行く日を設定することができます。しかし、それでも奇妙に見え、より良いオプションがあり、単数形を使用することです:

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

今、あなたは本当に列挙型の意味を示しています。通常、どのドメインでも、列挙型の各定数は1つの要素に過ぎないため、列挙型に単数形を使用するのが最適なオプションです。

.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でこれを行うには、より多くのメモリを使用しますが、より簡単で明確なのは、単にリストを使用することです。


2
実際、これを行うためのより良い方法は、BitSetをカプセル化し、そのすべてを処理するEnumSetです。:-)
corsiKa 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.