it-swarm.com.de

Codierungskonventionen - Benennen von Enums

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

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

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

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

Ich bin dagegen, es zu benennen:

FruitEnum
NetworkConnectionTypeEnum

Ich verstehe, dass es leicht ist, herauszufinden, welche Dateien Enums sind, aber dann hätten Sie auch:

NetworkConnectionClass
FruitClass

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

240
Walter White

Aufzählungen sind Klassen und sollten den Konventionen für Klassen folgen. Instanzen einer Enumeration sind Konstanten und sollten den Konventionen für Konstanten folgen. So 

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

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

Java selbst empfiehlt diesen Ansatz und wird in ihren Beispielen verwendet .

397
DJClayworth

Das wird mich wahrscheinlich nicht zu vielen neuen Freunden machen, aber es sollte hinzugefügt werden, dass die C # -Leute eine andere Richtlinie haben: Die Enumerationsinstanzen sind "Pascal-Fall" (Groß-/Kleinschreibung gemischt). Siehe stackoverflow-Diskussion und Richtlinien zur Benennung von MSDN-Aufzählungstypen .

Da wir Daten mit einem C # -System austauschen, bin ich versucht, ihre Aufzählungen genau zu kopieren und die Konventionen von Konstanten mit Großbuchstaben von Java zu ignorieren. 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 Enumenkonstante zu erhalten, und ein gemischter Fallname würde schöner aussehen.

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

66
StaticNoiseLog

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

Beim Durchsehen eines JavaEE7-Tutorials auf der Oracle-Website ( http://www.Oracle.com/technetwork/Java/javaee/downloads/index.html ) stolperte ich jedoch über das Tutorial "Duke's Bookstore" und In einer Klasse (tutorial\examples\case-studies\dukes-bookstore\src\main\Java\javaeetutorial\dukesbookstore\components\AreaComponent.Java) habe ich folgende Definition der Enumene gefunden:

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

Nach den Konventionen hätte es aussehen sollen:

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

Es scheint also, dass selbst die Jungs bei Oracle manchmal Konvention mit Bequemlichkeit handeln. 

17
beosign

In unserer Codebasis; Wir deklarieren normalerweise Enumerationen in der Klasse, zu der sie gehören.

Für Ihr Fruchtbeispiel hätten wir eine Fruchtklasse und darin eine Aufzählung namens Früchte.

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

Konstanten folgen der gleichen Zeile, in der sie entweder in der Klasse definiert werden, für die sie relevant sind (so etwas wie Fruit.ORANGE_BUSHEL_SIZE); oder wenn sie systemweit (d. h. einen äquivalenten "Nullwert" für ints) in einer Klasse mit dem Namen "ConstantManager" (oder einem gleichwertigen Code wie ConstantManager.NULL_INT) anwenden. (Randbemerkung; alle unsere Konstanten sind in Großbuchstaben)

Wie immer unterscheiden sich Ihre Kodierungsstandards wahrscheinlich von meinen; so YMMV.

13
Jim B

Sie sind immer noch Typen, daher verwende ich immer dieselben Namenskonventionen wie Klassen.

Ich würde definitiv die Stirn runzeln, wenn man "Class" oder "Enum" in einen Namen setzt. Wenn Sie sowohl eine FruitClass als auch eine FruitEnum haben, stimmt etwas anderes nicht und Sie benötigen mehr beschreibende Namen. Ich versuche, über die Art von Code nachzudenken, die beides erfordern würde, und es scheint, als sollte es eine Fruit-Basisklasse mit Untertypen anstelle einer Aufzählung geben. (Das ist nur meine eigene Spekulation, aber Sie haben vielleicht eine andere Situation als ich mir vorstelle.)

Die beste Referenz, die ich für die Benennung von Konstanten finden kann, stammt aus dem Tutorial Variables :

Wenn der von Ihnen gewählte Name nur aus einem Wort besteht, buchstabieren Sie dieses Wort in Kleinbuchstaben. Wenn es aus mehr als einem Wort besteht, den ersten Buchstaben jedes nachfolgenden Wortes groß schreiben. Die Namen gearRatio und currentGear sind Paradebeispiele dieser Konvention. Wenn Ihre Variable einen konstanten Wert speichert, z. B. statisches final int NUM_GEARS = 6, ändert sich die Konvention geringfügig. Dabei werden alle Buchstaben großgeschrieben und nachfolgende Wörter mit dem Unterstrich getrennt. In der Regel wird der Unterstrich nie anderswo verwendet. 

7
Bill the Lizard

Wenn ich meine $ 0,02 hinzufügen kann, benutze ich vorzugsweise PascalCase als Aufzählungswerte in C.

In C sind sie im Wesentlichen global, und PEER_CONNECTED wird im Gegensatz zu PeerConnected sehr anstrengend.

Hauch frischer Luft.

Wörtlich macht es mich leichter zu atmen.

In Java ist es möglich, rohe Enumerationsnamen zu verwenden, solange Sie sie statisch aus einer anderen Klasse importieren.

import static pkg.EnumClass.*;

Jetzt können Sie die unqualifizierten Namen verwenden, die Sie bereits auf andere Weise qualifiziert haben.

Ich denke gerade darüber nach, etwas C-Code nach Java zu portieren und derzeit zwischen der Wahl der Java-Konvention (die ausführlicher, langwieriger und hässlicher ist) und meinem C-Stil "hin- und hergerissen" zu sein.

PeerConnected würde zu PeerState.CONNECTED, außer in switch-Anweisungen, wo CONNECTED steht.

Nun gibt es viel zu sagen für die letztere Konvention und es sieht nett aus, aber bestimmte "idiomatische Phrasen" wie if (s == PeerAvailable) werden wie if (s == PeerState.AVAILABLE) und nostalgisch bedeutet dies einen Bedeutungsverlust für mich.

Ich denke, ich ziehe den Java-Stil aus Gründen der Klarheit immer noch vor, aber ich kann den schreienden Code nur schwer betrachten.

Jetzt ist mir klar, dass PascalCase in Java bereits weit verbreitet ist, aber sehr verwirrend wäre es nicht wirklich, nur ein bisschen fehl am Platz.

0
Xennex81
enum MyEnum {VALUE_1,VALUE_2}

ist (ungefähr) wie zu sagen

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

ich denke, dass alle Caps absolut korrekt sind, aber ich benutze immer noch die Klassennamen-Konvention, da ich Caps überall hasse 

0
Damian kober