Conventions De Codage-Énums De Nommage

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

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

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

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

je suis opposé à la nomination de lui:

FruitEnum
NetworkConnectionTypeEnum

je comprends qu'il est facile de choisir quels fichiers sont des énums, mais alors vous auriez aussi:

NetworkConnectionClass
FruitClass

Aussi, est-il un bon document décrivant la même pour les constantes, où déclarer, etc.?

224
demandé sur 5 revs, 5 users 71%Walter White 2010-06-18 16:57:13

7 réponses

les Énumérations sont des classes et doit suivre les conventions pour les classes. Les Instances d'un enum sont des constantes et doivent suivre les conventions pour les constantes. So

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

il n'y a pas plus de raison d'écrire FruitEnum que FruitClass. Vous gaspillez juste quatre (ou cinq) caractères qui n'ajoutent aucune information.

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

370
répondu DJClayworth 2016-07-20 02:20:57

cela ne me fera probablement pas beaucoup de nouveaux amis, mais il faut ajouter que les gens de C# ont une ligne directrice différente: les instances d'enum sont" Cas Pascal " (cas supérieur/cas inférieur mixte). Voir stackoverflow discussion et MSDN Type d'Énumération de l'intitulé .

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

donc, oui, j'ose remettre en question la valeur de la convention de nommage 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.

63
répondu StaticNoiseLog 2017-05-23 12:10:12

comme déjà indiqué, les instances d'enum devraient être en majuscules selon les docs sur le site D'Oracle ( http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html ).

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

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

selon les conventions, il 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;
    }
}

donc il semble que même les gars D'Oracle échangent parfois convention avec convenance.

15
répondu beosign 2015-07-18 10:03:12

dans notre base de données; nous déclarons généralement les énums dans la classe à laquelle ils appartiennent.

donc pour votre exemple de Fruit, nous aurions une classe de Fruit, et à l'intérieur de cela un Énum appelé Fruits.

Référencement 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 sont pertinentes (donc quelque chose comme Fruit.ORANGE_BUSHEL_SIZE ); ou si elles s'appliquent à l'échelle du système (c.-à-d. une "valeur nulle" équivalente pour les ints) dans une classe appelée "ConstantManager" (ou l'é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.

13
répondu Jim B 2010-06-18 13:04:31

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

Je désapprouverais certainement de mettre" classe "ou" Enum " dans un nom. Si vous avez à la fois un FruitClass et un FruitEnum alors quelque chose d'autre est faux et vous avez besoin de plus de noms descriptifs. J'essaye de penser au genre 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 mon par contre, vous avez peut-être une situation différente de celle que j'imagine.)

la meilleure référence que je puisse trouver pour nommer les constantes vient du tutoriel Variables 151990920":

Si le nom que vous choisissez se compose d'un seul mot, sort ce mot en minuscules. S'il est composé de plus d'un mot, inscrivez la première lettre de chaque mot suivant. Les noms gearRatio et currentGear sont principaux 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 majuscules chaque lettre et en séparant les mots suivants avec le caractère underscore. Par convention, le caractère de soulignement n'est jamais utilisé ailleurs.

6
répondu Bill the Lizard 2010-06-18 13:13:11
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 all caps est strictement plus correct, mais j'utilise quand même la Convention class name car je déteste tous les caps où que ce soit

0
répondu Damian kober 2018-04-11 17:38:59

si je peux ajouter mon $0.02, je préfère utiliser PascalCase comme valeurs enum en C.

en C, ils sont fondamentalement global, et PEER_CONNECTED devient vraiment fatigant par opposition à PeerConnected.

souffle d'air frais.

littéralement, ça me rend la respiration plus facile.

en Java, il est possible d'utiliser des noms enum bruts tant que vous les importez statiquement d'une autre classe.

import static pkg.EnumClass.*;

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

je pense actuellement au portage D'un certain code C vers 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.

connectés au PeerConnected deviendrait PeerState.Connecté sauf dans les instructions switch, où il est connecté.

maintenant il y a beaucoup à dire pour cette dernière convention et ça a l'air sympa, mais certaines "phrases idiomatiques" comme if (s == PeerAvailable) deviennent comme if (s == PeerState.AVAILABLE) et avec nostalgie, c'est une perte de sens pour moi.

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

maintenant je me rends compte que le PascalCase est déjà largement utilisé en Java, mais très confus, il ne serait pas vraiment, juste un peu hors de propos.

0
répondu Xennex81 2018-05-03 07:54:27