web-dev-qa-db-ja.com

Javaでの列挙の命名:単数または複数?

Java列挙型の命名方法に関する「公式の」推奨事項はありますか?

enum Protocol { HTTP, HTTPS, FTP }

または

enum Protocols { HTTP, HTTPS, FTP }

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

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

164
friederbluemle

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

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

200
Avram Score

データベースでテーブル名を定義するとき、またはJavaでクラスを定義するときと同じように、enumに単数形を使用することも最適なオプションです。使用方法をご覧ください。

例を書いてみましょう:

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)になり、多くの人は、予定が1日以上で発生する可能性があるのではないかと疑っています。

会社で働いている場合、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でも同じことができますが、enumは依然として単数形です。

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

19
Josep Panadero