Convenções de codificação - nomeação de enums

289

Existe uma convenção para nomear enumerações em Java?

Minha preferência é que um enum seja um tipo. Então, por exemplo, você tem um enum

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

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

Sou contra o nome:

FruitEnum
NetworkConnectionTypeEnum

Entendo que é fácil escolher quais arquivos são enumerados, mas você também teria:

NetworkConnectionClass
FruitClass

Além disso, existe um bom documento descrevendo o mesmo para constantes, onde declará-las etc.?

Walter White
fonte
2
Crie um Wiki da comunidade. Como não existe uma resposta aceitável única, ela seria fechada caso contrário.
Alexander Pogrebnyak
13
@Alexander Pogrebnyak Não, há uma resposta.
Tom Hawtin - tackline

Respostas:

473

Enums são aulas e devem seguir as convenções para as aulas. Instâncias de um enum são constantes e devem seguir as convenções para constantes. assim

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

Não há razão para escrever FruitEnum mais do que FruitClass. Você está desperdiçando apenas quatro (ou cinco) caracteres que não adicionam informações.

O próprio Java recomenda essa abordagem e é usada em seus exemplos .

DJClayworth
fonte
22
Comecei a nomear minhas enums dessa maneira, mas, para facilitar a leitura, agora uso Fruit.Apple em vez de Fruit.APPLE.
38
@ Walter Por que fazer uma instância enum parecer uma classe para melhorar a legibilidade?
precisa saber é o seguinte
17
Tecnicamente, instâncias enum são classes. É por isso que eles podem ter métodos.
precisa
87
Não, uma instância enum é uma instância. Um enum é uma classe.
DJClayworth
30
A idéia de um padrão de nomenclatura que me faz digitar Fruit.APPLE.chew () realmente me incomoda. Além disso, embora seja uma prática muito ruim, o APPLE não precisa ser uma constante (imutável). Com a promoção de enums para classes Java completos eu não tenho certeza que utilizam convenções desenvolvido por algo que nem sequer existia no c (objetos, e não enums) sempre faz sentido
Bill K
76

Provavelmente isso não fará de mim muitos novos amigos, mas deve-se acrescentar que as pessoas do C # têm uma orientação diferente: as instâncias enum são "caso Pascal" (maiúsculas / minúsculas). Consulte a discussão stackoverflow e as Diretrizes de nomeação de tipos de enumeração do MSDN .

Como estamos trocando dados com um sistema C #, sou tentado a copiar exatamente suas enumerações, ignorando a convenção "constantes com nomes em maiúsculas" de Java. Pensando nisso, não vejo muito valor em me restringir a maiúsculas para instâncias enum. Para alguns propósitos, .name () é um atalho útil para obter uma representação legível de uma constante enum e um nome de caso misto pareceria melhor.

Então, sim, ouso questionar o valor da convenção de nomenclatura enum Java. O fato de "a outra metade do mundo da programação" realmente usar um estilo diferente me faz pensar que é legítimo duvidar de nossa própria religião.

StaticNoiseLog
fonte
7
ATÉ que apenas programadores Java ou C # sejam programadores reais e que seus números sejam iguais. #sarcasm
Mindwin
14
C # é uma linguagem excelente, mas isso é simplesmente bobo. Tudo é praticamente o caso pascal em C #, que é basicamente o mesmo que não ter convenções de nomenclatura; você não ganha nada olhando um nome. Você não pode dizer se é uma classe, método, propriedade etc.
Bassinator:
3
Além disso, booleano é praticamente um enum, as instâncias são verdadeiras e falsas, em minúsculas. Então sim, todas as letras maiúsculas são feias.
Florian F
@FlorianF, não confunda o tipo primário booleano com a classe Boolean ( docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html ). a classe usa a convenção em maiúsculas
IvoC 12/12
24

Como já foi dito, as instâncias enum devem estar em maiúsculas, de acordo com os documentos no site da Oracle ( http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html ).

No entanto, enquanto examinava um tutorial sobre JavaEE7 no site da Oracle ( http://www.oracle.com/technetwork/java/javaee/downloads/index.html ), deparei-me com o tutorial "Duke's bookstore" e em uma classe ( tutorial\examples\case-studies\dukes-bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java), Encontrei a seguinte definição de enumeração:

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

De acordo com as convenções, deveria ter se parecido com:

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

Parece que até os funcionários da Oracle às vezes trocam convenções com conveniência.

beosign
fonte
13

Em nossa base de código; normalmente declaramos enumerações na classe a que pertencem.

Então, para o seu exemplo de frutas, teríamos uma classe de frutas e, dentro dela, um enum chamado frutas.

Referenciá-lo no código é semelhante a:, Fruit.Fruits.Apple, Fruit.Fruits.Pearetc.

As constantes seguem a mesma linha, onde são definidas na classe para a qual são relevantes (algo assim Fruit.ORANGE_BUSHEL_SIZE); ou se eles aplicarem todo o sistema (ou seja, um "valor nulo" equivalente para ints) em uma classe chamada "ConstantManager" (ou equivalente; semelhante ConstantManager.NULL_INT). (nota lateral; todas as nossas constantes estão em maiúsculas)

Como sempre, seus padrões de codificação provavelmente diferem dos meus; então YMMV.

Jim B
fonte
5
Quero acrescentar que, atualmente, parece que as fábricas de objetos são nomeadas usando plurais, por exemplo Listse Maps. Na minha opinião, esta é uma boa convenção e eu apoio totalmente seu uso mais amplo.
Esko
Sim, eles são semelhantes aos meus padrões de codificação pessoal, mas diferentes dos meus padrões de codificação no local de trabalho. Como não temos muitos padrões para o trabalho, estou tentando encontrar um bom documento para usar como referência.
8
Fruit.Fruits.Appleé muito detalhado para mim, literalmente quebrando o princípio DRY :-) Eu preferiria, por exemplo Fruit.Type.APPLE.
Péter Török
2
Eu não gosto dessa abordagem. A maneira como isso é chamado, uma maçã é uma fruta ou, pelo menos, é confusa, pois não está claro que a maçã não é uma fruta. Eu gosto do exemplo de Peter. Pelo menos, é auto-documentado que o APPLE é um tipo de fruta. Apesar de toda esta frutas exemplo cheira tipo de podre ...
Mark Peters
1
Eu também não gosto disso. Se a classe 'Fruit' representa uma fruta (e deveria), o que pode representar 'Fruits'? Se Fruit (a classe) realmente é uma classe para lidar com frutas, então ele deve ser renomeado "FruitHandler' ou 'FruitManager'.
DJClayworth
7

Ainda são tipos, então eu sempre uso as mesmas convenções de nomenclatura que uso nas aulas.

Eu definitivamente desaprovaria colocar "Class" ou "Enum" em um nome. Se você tem um FruitClasse um FruitEnum, algo está errado e você precisa de nomes mais descritivos. Estou tentando pensar no tipo de código que levaria à necessidade de ambos, e parece que deveria haver uma Fruitclasse base com subtipos em vez de enumeração. (Mas isso é apenas minha própria especulação, você pode ter uma situação diferente da que estou imaginando.)

A melhor referência que posso encontrar para nomear constantes vem do tutorial Variáveis :

Se o nome escolhido consistir em apenas uma palavra, soletre essa palavra em todas as letras minúsculas. Se consistir em mais de uma palavra, coloque em maiúscula a primeira letra de cada palavra subsequente. Os nomes gearRatio e currentGear são exemplos principais desta convenção. Se sua variável armazena um valor constante, como final estático int NUM_GEARS = 6, a convenção muda um pouco, colocando em maiúscula todas as letras e separando as palavras subsequentes com o caractere sublinhado. Por convenção, o caractere sublinhado nunca é usado em outro lugar.

Bill the Lizard
fonte
A referência para nomear constantes é a oracle.com/technetwork/java/javase/documentation/...
Christoffer Hammarström
1

Se posso adicionar meus US $ 0,02, prefiro usar PascalCase como valores de enumeração em C.

Em C, eles são basicamente globais, e PEER_CONNECTED fica muito cansativo em oposição ao PeerConnected.

Respiração de ar fresco.

Literalmente, isso me faz respirar mais fácil.

Em Java, é possível usar nomes de enum brutos, desde que você os importe de forma estática de outra classe.

import static pkg.EnumClass.*;

Agora, você pode usar os nomes não qualificados, que você qualificou de uma maneira diferente.

Atualmente (estou pensando) em portar algum código C para Java e atualmente 'dividido' entre escolher a convenção Java (que é mais detalhada, mais longa e mais feia) e meu estilo C.

PeerConnected se tornaria PeerState.CONNECTED, exceto nas instruções do switch, onde está CONNECTED.

Agora, há muito a dizer sobre a última convenção e parece bom, mas certas "frases idiomáticas", como if (s == PeerAvailable)se tornam if (s == PeerState.AVAILABLE)e nostalgicamente, isso é uma perda de significado para mim.

Acho que ainda prefiro o estilo Java por causa da clareza, mas tenho dificuldade em analisar o código gritante.

Agora percebo que o PascalCase já é amplamente usado em Java, mas muito confuso, não seria realmente, apenas um pouco fora do lugar.

Xennex81
fonte
0
enum MyEnum {VALUE_1,VALUE_2}

é (aproximadamente) como dizer

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

então acho que as letras maiúsculas são estritamente mais corretas, mas ainda uso a convenção de nome de classe, já que odeio letras maiúsculas

Damian kober
fonte