コーディング規約-列挙型の命名


289

Javaで列挙型の命名規則はありますか?

私の好みは、列挙型がタイプであることです。したがって、たとえば、列挙型があります

Fruit{Apple,Orange,Banana,Pear, ... }

NetworkConnectionType{LAN,Data_3g,Data_4g, ... }

私はそれに名前を付けることに反対しています:

FruitEnum
NetworkConnectionTypeEnum

どのファイルが列挙型であるかを簡単に選択できることを理解していますが、次のようになります。

NetworkConnectionClass
FruitClass

また、定数について同じことを説明する良いドキュメント、それらをどこに宣言するかなどがありますか?


2
コミュニティウィキにしてください。単一の受け入れ可能な答えはなく、そうでなければ閉じられます。
Alexander Pogrebnyak

13
@Alexander Pogrebnyakいいえ、答えはあります。
トム・ホーティン-10

回答:


473

列挙型はクラスであり、クラスの規則に従う必要があります。列挙型のインスタンスは定数であり、定数の規則に従う必要があります。そう

enum Fruit {APPLE, ORANGE, BANANA, PEAR};

FruitClass以外にFruitEnumを書く理由はありません。情報を追加しない4文字(または5文字)を無駄にしているだけです。

Java自体がこのアプローチを推奨しており、その例で使用されています


22
このように列挙型に名前を付け始めましたが、読みやすくするために、Fruit.APPLEではなくFruit.Appleを使用しています。

38
@Walterなぜ列挙型インスタンスをクラスのように見せて読みやすさを向上させるのでしょうか?
DJClayworth

17
技術的には、列挙型インスタンスクラスです。それがメソッドを持つことができる理由です。
Ted Hopp

87
いいえ、列挙インスタンスはインスタンスです。列挙型はクラスです。
DJClayworth、

30
Fruit.APPLE.chew()とタイプするような命名パターンのアイデアは本当に私を悩ませます。また、これは非常に悪い習慣ですが、APPLEは定数(不変)である必要はありません。でもCには存在しなかった何かのために開発された、私は必ず規約を使用していない完全なJavaクラスに列挙型のプロモーションでは(オブジェクト、列挙型ではない)は、常に意味します
ビル・K

76

これはおそらく私に多くの新しい友達を作ることはありませんが、C#の人々には異なるガイドラインがあることを追加する必要があります:列挙型インスタンスは「Pascalケース」(大文字/小文字の混合)です。見るstackoverflowのディスカッションMSDN列挙型の名前付けガイドラインを

私たちはC#システムとデータを交換しているので、Javaの「定数には大文字の名前があります」の規則を無視して、列挙型を正確にコピーしたいと思っています。考えてみれば、列挙型のインスタンスを大文字に制限することにはあまり価値がありません。いくつかの目的のために、.name()は列挙定数の読み取り可能な表現を取得するための便利なショートカットであり、大文字と小文字が混在する名前は見栄えがよくなります。

だから、はい、あえてJava enum命名規則の値に疑問を投げかけます。「プログラミングのもう一方の半分」が実際に別のスタイルを使用しているという事実は、私たち自身の宗教を疑うことは正当だと思います。


7
TILは、JavaまたはC#プログラマーのみが実際のプログラマーであり、それらの数は等しいことを示します。#sarcasm
Mindwin

14
C#は他の点では優れた言語ですが、これはまったくばかげています。すべてはC#のほとんどのパスカルケースであり、基本的に命名規則がない場合と同じです。名前を見ても何も得られません。それはなど、クラス、メソッド、プロパティの場合は、言うことができない
Bassinator

3
また、ブール値は実質的には列挙型であり、インスタンスは小文字でtrueおよびfalseです。だからはい、すべての大文字は醜いです。
フロリアンF

@FlorianF、ブール型とプライマリブール型を混同しないでください(docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html)。クラスは大文字の規則を使用します
IvoC

24

すでに述べたように、enumインスタンスはOracle Webサイト(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)のドキュメントに従って大文字にする必要があります。)の。

ただし、OracleのWebサイト(http://www.oracle.com/technetwork/java/javaee/downloads/index.html)でJavaEE7チュートリアルを調べているときに、「デュークの書店」のチュートリアルとクラス(tutorial\examples\case-studies\dukes-bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java)、私は次の列挙型定義を見つけました:

private enum PropertyKeys {
    alt, coords, shape, targetImage;
}

慣例によれば、それは次のようになっているはずです。

public enum PropertyKeys {
    ALT("alt"), COORDS("coords"), SHAPE("shape"), TARGET_IMAGE("targetImage");

    private final String val;

    private PropertyKeys(String val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return val;
    }
}

したがって、オラクルの社員でさえ、慣習を都合よく交換しているようです。


13

私たちのコードベース; 通常、列挙型はそれらが属するクラスで宣言します。

したがって、Fruitの例では、Fruitクラスがあり、その中にFruitsというEnumがあります。

コードでそれを参照すると、次のようになります。 Fruit.Fruits.Apple, Fruit.Fruits.Pear

定数は同じ行に沿って続きます。定数は、関連するクラスで定義されます(そのようなものFruit.ORANGE_BUSHEL_SIZE)。または、「ConstantManager」(または同等の;のようなクラス)でシステム全体(つまり、intの同等の「null値」)を適用する場合ConstantManager.NULL_INT)。(補足:すべての定数は大文字です)

いつものように、コーディング標準はおそらく私のものとは異なります。そうYMMV。


5
私は、例えば、オブジェクトファクトリは、今日複数形を使用して命名されていることのように思えることを追加したいListsMaps。私の意見では、これは良い慣例であり、そのより広範な使用を完全にサポートします。
Esko、

ええ、それらは私の個人的なコーディング標準に似ていますが、私の職場のコーディング標準とは異なります。仕事のための標準があまり整っていないので、参考資料として使用できる適切なドキュメントを見つけようとしています。

8
Fruit.Fruits.Apple文字通りDRY原則を破り、あまりにも私には冗長です:-)私は例えば好むだろうFruit.Type.APPLE
ペーテルTörök

2
このアプローチは好きではありません。この名前が付けられた方法では、Appleは果物であるか、または少なくともAppleが果物ではないことが明確ではないため混乱しています。ピーターのタイプの例が好きです。少なくとも、APPLEが一種の果物であることは自明です。この果物全体の例は、腐ったようなにおいがしますが...
マークピーターズ

1
私もこれが好きではありません。「フルーツ」クラスが果物を表す(そしてそうすべきである)場合、「フルーツ」は何を表すことができますか?Fruit(クラス)がFruitを処理するためのクラスである場合は、名前を「FruitHandler」または「FruitManager」に変更する必要があります
DJClayworth

7

それらはまだ型なので、クラスに使用するのと同じ命名規則を常に使用します。

名前に「クラス」または「列挙型」を付けることは間違いなく避けます。a FruitClassとaの両方がある場合はFruitEnum、何か他のことが間違っていて、よりわかりやすい名前が必要です。私は両方が必要になるようなコードについて考えようとしています、そしてそれはあるはずのようですFruit列挙型の代わりにサブタイプを基本クラスです。(それは私自身の推測にすぎませんが、私が想像している状況とは異なる場合があります。)

定数に名前を付けるために見つけることができる最良のリファレンスは、変数のチュートリアルからのものです。

選択した名前が1つの単語のみで構成されている場合は、その単語をすべて小文字で綴ります。複数の単語で構成される場合は、後続の各単語の最初の文字を大文字にします。gearRatioとcurrentGearという名前は、この規則の主な例です。変数に静的なfinal int NUM_GEARS = 6などの定数値が格納されている場合、規則はわずかに変更され、すべての文字が大文字になり、後続の単語がアンダースコア文字で区切られます。慣例により、アンダースコア文字は他の場所では決して使用されません。



1

$ 0.02を追加できる場合、Cの列挙値としてPascalCaseを使用することを好みます。

Cでは、これらは基本的にグローバルであり、PEER_CONNECTEDはPeerConnectedとは対照的に本当に疲れます。

新鮮な空気の息吹。

文字通り、呼吸が楽になります。

Javaでは、別のクラスから静的にインポートする限り、生のenum名を使用できます。

import static pkg.EnumClass.*;

これで、すでに別の方法で修飾した非修飾名を使用できます。

私は現在、いくつかのCコードをJavaに移植することについて(考えています)、現在、Java規約(より冗長で、より長く、より醜い)と私のCスタイルのどちらを選択するかについて「引き裂かれています」。

PeerConnectedは、それがCONNECTEDであるswitchステートメントを除いて、PeerState.CONNECTEDになります。

後者の慣習について言うべきことはたくさんありますが、見た目は良いですが、懐かしくif (s == PeerAvailable)なるような特定の「慣用句」if (s == PeerState.AVAILABLE)は、私にとっては意味の喪失です。

明快さのためにJavaスタイルを好むと思いますが、悲鳴を上げるコードを見るのに苦労します。

PascalCaseはすでにJavaで広く使用されていますが、非常に混乱することはないでしょう。


0
enum MyEnum {VALUE_1,VALUE_2}

(だいたい)言っているような

class MyEnum {

    public static final MyEnum VALUE_1 = new MyEnum("VALUE_1");
    public static final MyEnum VALUE_2 = new MyEnum("VALUE_2");

    private final name;

    private MyEnum(String name) {
        this.name = name;
    }

    public String name() { return this.name }
}

だから私はすべての大文字が厳密に正しいと思いますが、どこでもすべての大文字が嫌いなのでクラス名の慣習を使います

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.