Codierungskonventionen - Namensnennungen


289

Gibt es eine Konvention zum Benennen von Aufzählungen in Java?

Ich bevorzuge, 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, es ist einfach herauszufinden, welche Dateien Aufzählungen sind, aber dann hätten Sie auch:

NetworkConnectionClass
FruitClass

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


2
Bitte machen Sie es zu einem Community-Wiki. Da es keine einzige akzeptable Antwort gibt und sie sonst geschlossen würde.
Alexander Pogrebnyak

13
@ Alexander Pogrebnyak Nein, es gibt eine Antwort.
Tom Hawtin - Tackline

Antworten:


473

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

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

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

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


22
Ich habe angefangen, meine Aufzählungen so zu benennen, aber aus Gründen der Lesbarkeit habe ich jetzt Fruit.Apple anstelle von Fruit.APPLE verwendet.

38
@Walter Warum sollte es die Lesbarkeit verbessern, wenn eine Enum-Instanz so aussieht, als wäre sie eine Klasse?
DJClayworth

17
Enum-Instanzen sind technisch gesehen Klassen. Deshalb können sie Methoden haben.
Ted Hopp

87
Nein, eine Enum-Instanz ist eine Instanz. Eine Aufzählung ist eine Klasse.
DJClayworth

30
Die Idee eines Namensmusters, bei dem ich Fruit.APPLE.chew () tippe, nervt mich wirklich. Auch wenn es eine sehr schlechte Praxis wäre, muss APPLE keine Konstante (unveränderlich) sein. Mit der Beförderung von Aufzählungen zu vollständigen Java-Klassen bin ich mir nicht sicher, ob Konventionen, die für etwas entwickelt wurden, das nicht einmal in c existiert (Objekte, keine Aufzählungen), immer Sinn machen
Bill K

76

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

Während wir Daten mit einem C # -System austauschen, bin ich versucht, ihre Aufzählungen genau zu kopieren, wobei ich Javas Konvention "Konstanten haben Großbuchstaben" ignoriere. Wenn ich darüber nachdenke, sehe ich nicht viel Wert darin, für Enum-Instanzen auf Großbuchstaben beschränkt zu sein. Für einige Zwecke ist .name () eine praktische Verknüpfung, um eine lesbare Darstellung einer Enum-Konstante zu erhalten, und ein gemischter Fallname würde besser 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.


7
Bis nur Java- oder C # -Programmierer echte Programmierer sind und ihre Anzahl gleich ist. #sarcasm
Mindwin

14
C # ist eine ansonsten großartige Sprache, aber das ist einfach nur albern. In C # ist alles so ziemlich pascal, was im Grunde das gleiche ist, als hätte man überhaupt keine Namenskonventionen. Sie gewinnen nichts, wenn Sie sich einen Namen ansehen. Sie können nicht sagen, ob es sich um eine Klasse, Methode, Eigenschaft usw. handelt
Bassinator

3
Außerdem ist Boolean praktisch eine Aufzählung, die Instanzen sind wahr und falsch, in Kleinbuchstaben. Also ja, alle Kappen sind hässlich.
Florian F

@FlorianF, verwechseln Sie den primären Booleschen Typ nicht mit der Klasse Boolean ( docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html ). Die Klasse verwendet die Konvention in Großbuchstaben
IvoC

24

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

Beim Durchsehen eines JavaEE7-Tutorials auf der Oracle-Website ( http://www.oracle.com/technetwork/java/javaee/downloads/index.html ) bin ich jedoch auf das Tutorial "Duke's Bookstore" und auf eine Klasse gestoßen ( tutorial\examples\case-studies\dukes-bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java) Fand ich folgende Aufzählungsdefinition:

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

Nach den Konventionen hätte es so 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 sogar die Mitarbeiter von Oracle Konventionen manchmal bequem handeln.


13

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

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

Die Referenzierung im Code sieht folgendermaßen aus: Fruit.Fruits.Apple, Fruit.Fruits.Pearusw.

Konstanten folgen der gleichen Linie, wo sie entweder in der Klasse definiert werden, für die sie relevant sind (also so etwas wie Fruit.ORANGE_BUSHEL_SIZE); oder wenn sie systemweit (dh einen äquivalenten "Nullwert" für Ints) in einer Klasse mit dem Namen "ConstantManager" (oder einem Äquivalent; wie ConstantManager.NULL_INT) angewendet werden . (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 so aussieht, als würden Objektfabriken heutzutage mit Pluralformen benannt, zum Beispiel Listsund Maps. Meiner Meinung nach ist dies eine gute Konvention, und ich unterstütze ihre weiter verbreitete Verwendung voll und ganz.
Esko

Ja, sie ähneln meinen persönlichen Codierungsstandards, unterscheiden sich jedoch von meinen Arbeitsplatzcodierungsstandards. Wir haben nicht viele Standards für die Arbeit, daher versuche ich, ein gutes Dokument zu finden, das als Referenz verwendet werden kann.

8
Fruit.Fruits.Appleist mir zu ausführlich und bricht buchstäblich das DRY-Prinzip :-) Ich würde es vorziehen, z Fruit.Type.APPLE.
Péter Török

2
Ich mag diesen Ansatz nicht. Die Art und Weise, wie dies genannt wird, ist ein Apfel entweder eine Frucht oder zumindest verwirrend, da nicht klar ist, dass Apple keine Frucht ist. Ich mag Peters Typ Beispiel. Zumindest ist es dann selbstdokumentierend, dass APPLE eine Art Frucht ist. Obwohl dieses ganze Fruchtbeispiel irgendwie faul riecht ...
Mark Peters

1
Das gefällt mir auch nicht. Wenn die Klasse "Obst" eine Frucht darstellt (und sollte), was kann dann "Obst" darstellen? Wenn Fruit (die Klasse) wirklich eine Klasse für den Umgang mit Obst ist, sollte sie in "FruitHandler" oder "FruitManager" umbenannt werden.
DJClayworth

7

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

Ich würde definitiv die Stirn runzeln, wenn ich "Class" oder "Enum" in einen Namen stecke. Wenn Sie sowohl ein FruitClassals auch ein FruitEnumhaben, stimmt etwas anderes nicht und Sie benötigen aussagekräftigere Namen. Ich versuche über die Art von Code nachzudenken, die dazu führen würde, dass beides benötigt wird, und es scheint, als sollte es einen gebenFruit Basisklasse mit Untertypen anstelle einer Aufzählung geben sollte. (Das ist nur meine eigene Spekulation, vielleicht haben Sie eine andere Situation als ich mir vorstelle.)

Die beste Referenz, die ich zum Benennen von Konstanten finden kann, stammt aus dem Variablen-Tutorial :

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, schreiben Sie den ersten Buchstaben jedes nachfolgenden Wortes in Großbuchstaben. 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, wobei jeder Buchstabe groß geschrieben und nachfolgende Wörter durch den Unterstrich getrennt werden. Konventionell wird der Unterstrich an keiner anderen Stelle verwendet.


Die Referenz für die Benennung von Konstanten ist unter oracle.com/technetwork/java/javase/documentation/…
Christoffer Hammarström

1

Wenn ich meine $ 0.02 hinzufügen kann, bevorzuge ich die Verwendung von PascalCase als Aufzählungswerte in C.

In C sind sie im Grunde genommen global und PEER_CONNECTED wird im Gegensatz zu PeerConnected sehr anstrengend.

Hauch frischer Luft.

Es erleichtert mir buchstäblich das Atmen.

In Java ist es möglich, unformatierte Aufzählungsnamen zu verwenden, solange Sie sie statisch aus einer anderen Klasse importieren.

import static pkg.EnumClass.*;

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

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

PeerConnected wird zu PeerState.CONNECTED, außer in switch-Anweisungen, in denen es CONNECTED ist.

Jetzt gibt es viel zu sagen für die letztere Konvention und es sieht gut aus, aber bestimmte "idiomatische Phrasen" wie if (s == PeerAvailable)wie if (s == PeerState.AVAILABLE)und nostalgisch werden, das ist ein Bedeutungsverlust für mich.

Ich glaube, ich bevorzuge aus Gründen der Klarheit immer noch den Java-Stil, aber es fällt mir schwer, den schreienden Code zu 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
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, die Großbuchstaben sind streng korrekter, aber ich verwende immer noch die Klassennamenkonvention, da ich alle Großbuchstaben überall hasse

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.