web-dev-qa-db-fra.com

Conventions de codage - Enumération de noms

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

Ma préférence est qu'une enum est un type. Donc, par exemple, vous avez un enum 

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

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

Je suis opposé à le nommer:

FruitEnum
NetworkConnectionTypeEnum

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

NetworkConnectionClass
FruitClass

De même, existe-t-il un bon document décrivant le même principe pour les constantes, où les déclarer, etc.?

240
Walter White

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

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

Il n'y a aucune raison d'écrire FruitEnum, pas plus que FruitClass. Vous ne faites que gaspiller 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 .

397
DJClayworth

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 des "cas Pascal" (mixte majuscule/minuscule). Voir discussion de stackoverflow et Instructions de nommage des types d'énumération MSDN .

Comme nous échangeons des données avec un système C #, je suis tenté de copier exactement leur énumération, en ignorant la convention "Les constantes ont des noms en majuscules" de Java. En y réfléchissant, je ne vois pas l’intérêt d’être limité aux majuscules pour les instances enum. Dans certains cas, .name () est un raccourci pratique pour obtenir une représentation lisible d'une constante enum et un nom de casse mixte semblerait 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.

66
StaticNoiseLog

Comme indiqué plus haut, les instances enum doivent être majuscules conformément à la documentation du site Web Oracle ( http://docs.Oracle.com/javase/tutorial/Java/javaOO/enum.html ).

Cependant, en parcourant un didacticiel JavaEE7 sur le site Web 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 échangent parfois des conventions avec commodité. 

17
beosign

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

Donc, pour votre exemple Fruit, nous aurions une classe Fruit et à l'intérieur de celle-ci un Énum appelé Fruits.

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

Les constantes suivent la même ligne, où elles sont soit définies dans la classe à laquelle elles s'appliquent (donc quelque chose comme Fruit.ORANGE_BUSHEL_SIZE); ou s’ils appliquent l’ensemble du système (c'est-à-dire une "valeur nulle" équivalente pour ints) dans une classe nommée "ConstantManager" (ou un équivalent; comme ConstantManager.NULL_INT). (note de côté; toutes nos constantes sont en majuscule)

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

13
Jim B

Ils sont toujours des types, donc j'utilise toujours les mêmes conventions de nommage que pour les classes.

Je voudrais certainement froncer les sourcils en mettant "Classe" ou "Enum" dans un nom. Si vous avez à la fois une FruitClass et une FruitEnum, quelque chose d'autre ne va pas et vous avez besoin de noms plus descriptifs. J'essaie de réfléchir au type de code qui conduirait à avoir besoin des deux, et il semble qu'il devrait y avoir une classe de base Fruit avec des sous-types au lieu d'un enum. (C'est juste ma propre spéculation cependant, vous pouvez avoir une situation différente de celle que j'imagine.)

La meilleure référence que je puisse trouver pour les constantes de dénomination provient du didacticiel Variables :

Si le nom que vous choisissez se compose d'un seul mot, épelez-le en toutes lettres minuscules. S'il comporte plus d'un mot, 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 static final int NUM_GEARS = 6, la convention change légèrement, en mettant en majuscule chaque lettre et en séparant les mots suivants avec le caractère de soulignement. Par convention, le caractère de soulignement n'est jamais utilisé ailleurs. 

7
Bill the Lizard

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

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

Bouffée d'air frais.

Littéralement, ça me permet de mieux respirer.

En Java, il est possible d’utiliser des noms d’énumérations brutes tant que vous les importez de manière statique à 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 réfléchis actuellement à porter du code C en Java et je suis actuellement «tiraillé» entre le choix de la convention Java (qui est plus détaillée, 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 ça a l'air sympa mais certaines "phrases idiomatiques" telles que if (s == PeerAvailable) deviennent comme if (s == PeerState.AVAILABLE) et nostalgiquement, c'est une perte de sens pour moi.

Je pense que je préfère toujours le style Java pour des raisons de clarté, mais j'ai du mal à regarder le code qui crie.

Maintenant, je me rends compte que PascalCase est déjà largement utilisé en Java, mais que cela ne serait pas très déroutant, mais plutôt déplacé.

0
Xennex81
enum MyEnum {VALUE_1,VALUE_2}

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 le tout en majuscule est strictement plus correct, mais j'utilise quand même la convention du nom de classe puisque je déteste le tout en majuscule 

0
Damian kober