Conventions de codage - Nommer les énumérations


289

Existe-t-il une convention pour nommer les énumérations en Java?

Ma préférence est qu'une énumération est un type. Ainsi, par exemple, vous avez une énumération

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

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

Je m'oppose à le nommer:

FruitEnum
NetworkConnectionTypeEnum

Je comprends qu'il est facile de sélectionner les fichiers qui sont des énumérations, mais vous auriez également:

NetworkConnectionClass
FruitClass

Existe-t-il également un bon document décrivant la même chose pour les constantes, où les déclarer, etc.?


2
Veuillez en faire un Wiki communautaire. Comme il n'y a pas de réponse unique acceptable, et elle se fermerait autrement.
Alexander Pogrebnyak

13
@Alexander Pogrebnyak Non, il y a une réponse.
Tom Hawtin - tackline

Réponses:


473

Les énumérations sont des classes et doivent suivre les conventions des classes. Les instances d'une énumération sont des constantes et doivent suivre les conventions des constantes. Alors

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

Il n'y a aucune raison d'écrire FruitEnum plus que FruitClass. Vous perdez simplement quatre (ou cinq) caractères qui n'ajoutent aucune information.

Java lui-même recommande cette approche et elle est utilisée dans leurs exemples .


22
J'ai commencé à nommer mes énumérations de cette façon, mais pour plus de lisibilité, j'utilise maintenant Fruit.Apple au lieu de Fruit.APPLE.

38
@Walter Pourquoi faire en sorte qu'une instance enum ressemble à une classe améliore la lisibilité?
DJClayworth

17
Techniquement, les instances enum sont des classes. C'est pourquoi ils peuvent avoir des méthodes.
Ted Hopp

87
Non, une instance enum est une instance. Une énumération est une classe.
DJClayworth

30
L'idée d'un modèle de nommage qui me fait taper Fruit.APPLE.chew () me dérange vraiment. De plus, bien que ce soit une très mauvaise pratique, APPLE ne doit pas être une constante (immuable). Avec la promotion des énumérations en classes Java complètes, je ne suis pas sûr que l'utilisation de conventions développées pour quelque chose qui n'existait même pas en c (objets, pas énumérations) ait toujours du sens
Bill K

76

Cela ne me fera probablement pas beaucoup de nouveaux amis, mais il faut ajouter que les personnes C # ont une directive différente: les instances enum sont "cas Pascal" (majuscules / minuscules mixtes). Voir la discussion stackoverflow et les directives de dénomination des types d'énumération MSDN .

Comme nous échangeons des données avec un système C #, je suis tenté de copier leurs énumérations exactement, en ignorant la convention de Java "les constantes ont des noms en majuscules". En y réfléchissant, je ne vois pas beaucoup de valeur à être limité aux majuscules pour les instances enum. À certaines fins, .name () est un raccourci pratique pour obtenir une représentation lisible d'une constante enum et un nom de casse mixte serait plus joli.

Donc, oui, j'ose remettre en question la valeur de la convention de dénomination Java enum. Le fait que "l'autre moitié du monde de la programmation" utilise effectivement un style différent me fait penser qu'il est légitime de douter de notre propre religion.


7
TIL que seuls les programmeurs Java ou C # sont de vrais programmeurs et que leurs nombres sont égaux. #sarcasm
Mindwin

14
C # est un langage par ailleurs génial, mais c'est tout simplement stupide. Tout est à peu près le cas pascal en C #, qui est fondamentalement le même que n'ayant aucune convention de nommage du tout; vous ne gagnez rien en regardant un nom. Vous ne pouvez pas dire s'il s'agit d'une classe, d'une méthode, d'une propriété, etc.
Bassinator

3
De plus, booléen est pratiquement une énumération, les instances sont vraies et fausses, en minuscules. Alors oui, toutes les majuscules sont moches.
Florian F

@FlorianF, ne confondez pas le type booléen principal avec la classe Boolean ( docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html ). la classe utilise la convention en majuscules
IvoC

24

Comme déjà indiqué, les instances d'énumération doivent être en majuscules selon les documents sur le site Web Oracle ( http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html ).

Cependant, en parcourant un didacticiel JavaEE7 sur le site Web d'Oracle ( http://www.oracle.com/technetwork/java/javaee/downloads/index.html ), je suis tombé sur le didacticiel "Duke's bookstore" et dans une classe ( tutorial\examples\case-studies\dukes-bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java), J'ai trouvé la définition d'énumération suivante:

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

Selon les conventions, cela aurait dû ressembler à:

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

Il semble donc que même les gars d'Oracle négocient parfois les conventions avec commodité.


13

Dans notre base de code; nous déclarons généralement des énumérations dans la classe à laquelle ils appartiennent.

Donc, pour votre exemple Fruit, nous aurions une classe Fruit, et à l'intérieur un Enum appelé Fruits.

Le référencer dans le code ressemble à ceci:, Fruit.Fruits.Apple, Fruit.Fruits.Pearetc.

Les constantes suivent la même ligne, où elles sont soit définies dans la classe à laquelle elles sont pertinentes (donc quelque chose comme Fruit.ORANGE_BUSHEL_SIZE); ou s'ils s'appliquent à l'échelle du système (c'est-à-dire une "valeur nulle" équivalente pour les entiers) dans une classe nommée "ConstantManager" (ou équivalent; comme ConstantManager.NULL_INT). (note latérale; toutes nos constantes sont en majuscules)

Comme toujours, vos normes de codage diffèrent probablement des miennes; donc YMMV.


5
Je veux ajouter qu'il semble que les usines d'objets soient aujourd'hui nommées en utilisant des pluriels, par exemple Listset Maps. À mon avis, c'est une bonne convention et je soutiens pleinement son utilisation plus répandue.
Esko

Oui, ils sont similaires à mes normes de codage personnelles, mais différents de mes normes de codage en milieu de travail. Nous n'avons pas beaucoup de normes en place pour le travail, donc j'essaie de trouver un bon document à utiliser comme référence.

8
Fruit.Fruits.Appleest trop verbeux pour moi, brisant littéralement le principe SEC :-) Je préférerais par exemple Fruit.Type.APPLE.
Péter Török

2
Je n'aime pas cette approche. La façon dont cela est nommé, une pomme est soit un fruit, ou à tout le moins, c'est déroutant car il n'est pas clair que la pomme n'est pas un fruit. J'aime l'exemple de Peter's Type. Au moins, il est auto-documenté qu'APPLE est un type de fruit. Bien que cet exemple de fruits entiers ait une odeur pourrie ...
Mark Peters

1
Je n'aime pas ça non plus. Si la classe «Fruit» représente un fruit (et il le devrait), que peut représenter «Fruits»? Si Fruit (la classe) est vraiment une classe pour traiter les fruits, alors il devrait être renommé "FruitHandler" ou "FruitManager".
DJClayworth

7

Ce sont toujours des types, donc j'utilise toujours les mêmes conventions de dénomination que j'utilise pour les classes.

Je voudrais vraiment froncer les sourcils en mettant "Class" ou "Enum" dans un nom. Si vous avez à la fois a FruitClasset a, FruitEnumalors quelque chose d'autre ne va pas et vous avez besoin de noms plus descriptifs. J'essaie de penser au type de code qui conduirait à avoir besoin des deux, et il semble qu'il devrait y avoir une Fruitclasse de base avec des sous-types au lieu d'une énumération. (C'est juste ma propre spéculation cependant, vous pouvez avoir une situation différente de ce que j'imagine.)

La meilleure référence que je peux trouver pour nommer les constantes vient du tutoriel Variables :

Si le nom que vous choisissez se compose d'un seul mot, épelez ce mot dans toutes les lettres minuscules. S'il se compose de plusieurs mots, mettez en majuscule la première lettre de chaque mot suivant. Les noms gearRatio et currentGear sont d'excellents exemples de cette convention. Si votre variable stocke une valeur constante, telle que statique final int NUM_GEARS = 6, la convention change légèrement, mettant en majuscule chaque lettre et séparant les mots suivants par le caractère de soulignement. Par convention, le caractère de soulignement n'est jamais utilisé ailleurs.


La référence pour nommer les constantes est sur oracle.com/technetwork/java/javase/documentation/…
Christoffer Hammarström

1

Si je peux ajouter mes 0,02 $, je préfère utiliser PascalCase comme valeurs d'énumération en C.

En C, ils sont globalement globaux et PEER_CONNECTED devient vraiment fatigant par opposition à PeerConnected.

Bouffée d'air frais.

Littéralement, cela me fait respirer plus facilement.

En Java, il est possible d'utiliser des noms d'énumération bruts tant que vous les importez statiquement à partir d'une autre classe.

import static pkg.EnumClass.*;

Maintenant, vous pouvez utiliser les noms non qualifiés que vous avez déjà qualifiés d'une manière différente.

Je pense (actuellement) à porter du code C sur Java et actuellement «déchiré» entre le choix de la convention Java (qui est plus verbeuse, plus longue et plus laide) et mon style C.

PeerConnected deviendrait PeerState.CONNECTED sauf dans les instructions switch, où il est CONNECTED.

Maintenant, il y a beaucoup à dire pour cette dernière convention et elle a l'air sympa mais certaines "phrases idiomatiques" telles que if (s == PeerAvailable)devenir semblables if (s == PeerState.AVAILABLE)et nostalgiques, c'est une perte de sens pour moi.

Je pense que je préfère toujours le style Java à cause de la clarté, mais j'ai du mal à regarder le code hurlant.

Maintenant, je me rends compte que PascalCase est déjà largement utilisé en Java, mais très confus ce ne serait pas vraiment, juste un peu à sa place.


0
enum MyEnum {VALUE_1,VALUE_2}

c'est (approximativement) comme dire

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

donc je suppose que les majuscules sont strictement plus correctes, mais j'utilise toujours la convention de nom de classe car je déteste toutes les majuscules partout

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.