web-dev-qa-db-ja.com

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

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

私の好みは列挙型が型だということです。だから、例えば、あなたは列挙型を持っている

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

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

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

FruitEnum
NetworkConnectionTypeEnum

どのファイルがenumであるかを選ぶのは簡単だと思いますが、そうすると次のようになります。

NetworkConnectionClass
FruitClass

また、定数、それらを宣言する場所などについても同じことを説明した優れた文書はありますか?

257
Walter White

列挙型はクラスであり、クラスの規約に従います。列挙型のインスタンスは定数であり、定数の規約に従うべきです。そう

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

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

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

422
DJClayworth

これはおそらく私を新しい友達にはしないでしょうが、C#の人々は別のガイドラインを持っていることを付け加えておくべきです。 スタックオーバーフローの説明 および MSDN列挙型命名ガイドライン を参照してください。

C#システムとデータを交換しているので、Javaの「定数には大文字の名前がある」という規則を無視して、それらの列挙型を正確にコピーしたいと思います。それについて考えても、列挙型インスタンスを大文字に制限することにはあまり意味がありません。いくつかの目的のために.name()は列挙定数の読みやすい表現を得るための便利な近道であり、大文字小文字混合名はより良く見えるでしょう。

それで、はい、私はあえてJava列挙型命名規則の価値に疑問を呈します。 「プログラミングの世界の他の半分」が実際に異なるスタイルを使用しているという事実は、私たち自身の宗教を疑うことが正当であると私に考えさせます。

69
StaticNoiseLog

すでに述べたように、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)で、私は以下のenum定義を見つけました:

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

そのため、オラクルの従業員でもコンベンションを都合よく取り引きしているようです。

18
beosign

私たちのコードベースでは。私たちは通常それらが属するクラスでenumを宣言します。

だからあなたのフルーツの例では、私たちはフルーツクラスを持っているでしょう、そしてその中にフルーツと呼ばれるEnumがあります。

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

定数は同じ行に沿って続きます。そこでは、定数は関連するクラスで定義されます(したがって、Fruit.ORANGE_BUSHEL_SIZEのようなもの)。あるいは、それらが「ConstantManager」という名前のクラスにシステム全体に適用される場合(つまり、intに対して同等の「null値」)(または同等。ConstantManager.NULL_INTのように)。 (サイドノート。すべての定数は大文字です)

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

13
Jim B

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

私は間違いなく「Class」または「Enum」を名前に入れることに眉をひそめます。あなたがFruitClassFruitEnumの両方を持っているならば、何か他のものが間違っているので、もっとわかりやすい名前が必要です。私は両方を必要とするようなコードの種類について考えようとしています、そしてそれはenumの代わりにサブタイプを持つFruit基本クラスがあるべきであるように思えます。 (それは私自身の憶測ですが、あなたは私が想像しているのとは異なる状況にあるかもしれません)

命名定数について私が見つけることができる最もよい参照は Variables tutorial から来ています。

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

7
Bill the Lizard

私が$ 0.02を追加することができるならば、私はCのenum値として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
Xennex81
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 }
}

だから私はすべて大文字が厳密により正確であると思います、しかし私は私がどこでもどこでもすべて大文字を嫌っているのでそれでもクラス名規約を使います

0
Damian kober