2010-06-18 3 views
211

Gibt es eine Konvention für die Benennung von Aufzählungen in Java?Kodierungskonventionen - Namensaufrufe

Meine Präferenz ist, dass eine Enum ein Typ ist. So zum Beispiel, haben Sie eine ENUM

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

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

Ich bin gegen die Namensgebung:

FruitEnum 
NetworkConnectionTypeEnum 

Ich verstehe, es ist einfach, weg zu holen, welche Dateien Aufzählungen sind, aber dann würden Sie auch haben:

NetworkConnectionClass 
FruitClass 

Gibt es auch ein gutes Dokument, das dasselbe für Konstanten beschreibt, wo man sie deklariert usw.?

+1

Bitte machen Sie es zu einem Community Wiki. Da gibt es keine einzige akzeptable Antwort, und es würde sonst geschlossen werden. –

+10

@Alexander Pogrebnyak Nein, es gibt eine Antwort. –

+0

@AlexanderPogrebnyak gibt es eine Antwort. –

Antwort

340

Enums sind Klassen und sollten den Konventionen für Klassen folgen. Instanzen eines Enums sind Konstanten und sollten den Konventionen für Konstanten folgen. Also

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

Es gibt keinen Grund, FruitEnum mehr als FruitClass zu schreiben. Sie verschwenden nur vier (oder fünf) Zeichen, die keine Informationen hinzufügen.

Java selbst empfiehlt diesen Ansatz und es ist used in their examples.

+1

Ich teile die gleiche Meinung. –

+17

Ich begann zu benennen Ich habe jetzt Fruit.Apple anstelle von Fruit.APPLE verwendet –

+31

@Walter Warum würde eine enum-Instanz so aussehen, als wäre sie eine Klasse, um die Lesbarkeit zu verbessern? – DJClayworth

13

In unserer Codebasis; Normalerweise deklarieren wir Enums in der Klasse, zu der sie gehören.

Also für Ihr Obst-Beispiel, Wir hätten eine Fruit-Klasse, und darin eine Enum namens Fruits.

es im Code Referenzierung sieht wie folgt aus: Fruit.Fruits.Apple, Fruit.Fruits.Pear usw.

Konstanten entlang der gleichen Linie folgen, wo sie entweder in der Klasse definiert erhalten, auf die sie relevant sind (so etwas wie Fruit.ORANGE_BUSHEL_SIZE); oder wenn sie systemweit angewendet werden (d. h. ein äquivalenter "Nullwert" für Ints) in einer Klasse mit dem Namen "ConstantManager" (oder gleichwertig; wie ConstantManager.NULL_INT). (Randnotiz; alle unsere Konstanten sind in Großbuchstaben)

Wie immer unterscheiden sich Ihre Codierungsstandards wahrscheinlich von meinen; Also YMMV.

+5

Ich möchte hinzufügen, dass es scheint, dass das Objekt Fabriken heute Plural genannt werden, zum Beispiel "Listen" und "Maps". Meiner Meinung nach ist dies eine gute Konvention und ich unterstütze voll und ganz seine Verbreitung. – Esko

+0

Ja, sie sind meinen persönlichen Kodierungsstandards ähnlich, unterscheiden sich aber von meinen Kodierungsstandards am Arbeitsplatz. Wir haben nicht viele Standards für die Arbeit, also versuche ich ein gutes Dokument zu finden, das als Referenz verwendet werden kann. –

+8

'Fruit.Fruits.Apple' ist zu sehr für mich, buchstäblich das DRY-Prinzip zu brechen :-) Ich würde z.B. 'Fruit.Type.APPLE'. –

5

Sie sind immer noch Typen, daher verwende ich immer die gleichen Namenskonventionen wie für Klassen.

Ich würde definitiv Stirnrunzeln auf "Klasse" oder "Enum" in einem Namen setzen. Wenn Sie sowohl eine FruitClass als auch eine FruitEnum haben, dann stimmt etwas anderes nicht und Sie benötigen aussagekräftigere Namen. Ich versuche über die Art von Code nachzudenken, der dazu führen würde, beide zu benötigen, und es scheint, dass es eine Fruit Basisklasse mit Subtypen anstelle einer Enum geben sollte. (Das ist nur obwohl meine eigene Spekulation, können Sie eine andere Situation haben als das, was ich mir vor.)

Die beste Referenz, die ich stammt aus der Konstanten für die Benennung von Variables tutorial finden:

Wenn der Name Sie wählen aus nur einem Wort, buchstabieren Sie dieses Wort in allen Kleinbuchstaben. Wenn es aus mehr als einem Wort besteht, wird der erste Buchstabe jedes nachfolgenden Wortes groß geschrieben. Die Namen gearRatio und currentGear sind Paradebeispiele für diese Konvention. Wenn Ihre Variable einen konstanten Wert speichert, z. B. static final int NUM_GEARS = 6, ändert sich die Konvention geringfügig, indem jeder Buchstabe groß geschrieben und nachfolgende Wörter durch den Unterstrich getrennt werden. Per Konvention wird der Unterstrich niemals an anderer Stelle verwendet.

+0

Die Referenz für das Benennen von Konstanten ist http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#15436 –

59

Dies wird wahrscheinlich nicht viele neue Freunde machen, aber es sollte hinzugefügt werden, dass die C# Leute eine andere Richtlinie haben: Die Enum-Instanzen sind "Pascal Fall" (Groß-/Kleinschreibung gemischt). Siehe stackoverflow discussion und MSDN Enumeration Type Naming Guidelines.

Da wir Daten mit einem C# -System austauschen, bin ich versucht, ihre Enums genau zu kopieren, wobei die Konvention "Konstanten haben Großbuchstaben" von Java ignoriert wird. Wenn ich darüber nachdenke, sehe ich keinen großen Wert darin, für Enum-Instanzen auf Großbuchstaben beschränkt zu sein. Für einige Zwecke ist .name() eine praktische Abkürzung, um eine lesbare Darstellung einer Enum-Konstante zu erhalten, und ein gemischter Fallname würde schöner aussehen.

Also, ja, ich wage es, den Wert der Java-Enum-Namenskonvention in Frage zu stellen. Die Tatsache, dass "die andere Hälfte der Programmierwelt" tatsächlich einen anderen Stil verwendet, lässt mich denken, dass es legitim ist, an unserer eigenen Religion zu zweifeln.

+28

+1: Zweifel unsere eigene Religion – BLeB

+3

** TIL **, dass nur Java oder C# -Programmierer echte Programmierer sind, und dass ihre Zahlen gleich sind.#sarcasm – Mindwin

+1

auch, alle Caps sieht hässlich aus ... – Nyerguds

11

Wie bereits erwähnt, sollten enum-Instanzen gemäß den Dokumenten auf der Oracle-Website (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html) in Großbuchstaben angegeben werden.

Während jedoch durch eine JavaEE7 Tutorial auf der Oracle-Website (http://www.oracle.com/technetwork/java/javaee/downloads/index.html) auf der Suche, ich über den "Duke Buchhandlung" Tutorial und in einer Klasse gestolpert (tutorial\examples\case-studies\dukes-bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java), fand ich die folgende Enumerationsdefinition:

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

So ist es die Jungs manchmal zu Oracle handeln Konvention mit Bequemlichkeit scheint sogar:

nach den Konventionen, sollte es so ausgesehen haben.