2010-06-18 13 views
211

¿Existe una convención para nombrar enumeraciones en Java?Convenciones de codificación - Enumeración de nombres

Mi preferencia es que una enumeración es un tipo. Así, por ejemplo, tiene una enumeración

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

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

me opongo a nombrarlo:

FruitEnum 
NetworkConnectionTypeEnum 

entiendo que es fácil de escoger de qué archivos son enumeraciones, pero entonces también habría que:

NetworkConnectionClass 
FruitClass 

Además, ¿hay un buen documento que describe el mismo para las constantes, donde declararlos, etc.?

+1

Por favor, conviértalo en un Wiki de la comunidad. Como no hay una única respuesta aceptable, de lo contrario se cerraría. –

+10

@Alexander Pogrebnyak No, hay una respuesta. –

+0

@AlexanderPogrebnyak hay una respuesta. –

Respuesta

340

Los enumerados son clases y deben seguir las convenciones de las clases. Las instancias de una enumeración son constantes y deben seguir las convenciones para las constantes. Entonces

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

No hay razón para escribir FruitEnum más que FruitClass. Solo desperdicia cuatro (o cinco) caracteres que no agregan información.

Java mismo recomienda este enfoque y es used in their examples.

+1

Comparto la misma opinión. –

+17

Empecé a nombrar mis enumeraciones de esa manera, pero para facilitar la lectura, he estado usando Fruit.Apple en lugar de Fruit.APPLE. –

+31

@Walter ¿Por qué hacer que una instancia enum parezca una clase mejorar la legibilidad? – DJClayworth

13

En nuestra base de código; por lo general, declaramos enumeraciones en la clase a la que pertenecen.

Así que para su ejemplo de Fruta, tendríamos una clase de Frutas, y dentro de eso un Enum llamado Frutas.

referencia a ella en el código es el siguiente: Fruit.Fruits.Apple, Fruit.Fruits.Pear, etc.

Constantes siguen en la misma línea, en el que o bien obtener definen en la clase a la que son relevantes (así que algo como Fruit.ORANGE_BUSHEL_SIZE); o si se aplican a todo el sistema (es decir, un "valor nulo" equivalente para ints) en una clase llamada "ConstantManager" (o equivalente, como ConstantManager.NULL_INT). (nota al margen; todas nuestras constantes están en mayúsculas)

Como siempre, sus estándares de codificación probablemente difieran de los míos; así que YMMV.

+5

Quiero agregar que parece que las fábricas de objetos se nombran actualmente usando plurales, por ejemplo 'Listas' y' Mapas'. En mi opinión, esta es una buena convención y apoyo totalmente su uso más generalizado. – Esko

+0

Sí, son similares a mis estándares de codificación personal, pero diferentes a los estándares de codificación de mi lugar de trabajo. No tenemos muchos estándares establecidos para el trabajo, entonces estoy tratando de encontrar un buen documento para usar como referencia. –

+8

'Fruit.Fruits.Apple' es demasiado detallado para mí, literalmente rompiendo el principio DRY :-) Preferiría, por ejemplo. 'Fruit.Type.APPLE'. –

5

Todavía son tipos, por lo que siempre uso las mismas convenciones de nomenclatura que uso para las clases.

Definitivamente frunciría el ceño al poner "Clase" o "Enum" en un nombre. Si tiene un FruitClass y un FruitEnum, entonces algo más está mal y necesita más nombres descriptivos. Estoy tratando de pensar sobre el tipo de código que llevaría a necesitar ambos, y parece que debería haber una clase base Fruit con subtipos en lugar de una enumeración. (Eso es sólo mi propia especulación, sin embargo, es posible que tenga una situación diferente a lo que estoy imaginando.)

La mejor referencia que puedo encontrar para nombrar constantes proviene de la Variables tutorial:

Si el nombre eliges que consiste de una sola palabra, deletrea esa palabra en letras minúsculas. Si consta de más de una palabra, escribe en mayúscula la primera letra de cada palabra siguiente. Los nombres gearRatio y currentGear son ejemplos principales de esta convención. Si su variable almacena un valor constante, como static final int NUM_GEARS = 6, la convención cambia ligeramente, capitalizando cada letra y separando palabras subsecuentes con el carácter de subrayado. Por convención, el carácter de subrayado nunca se usa en ningún otro lado.

+0

La referencia para nombrar las constantes está en http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#15436 –

59

Esto probablemente no me hará muchos nuevos amigos, pero debería agregarse que las personas C# tienen una pauta diferente: Las instancias enum son "caso Pascal" (mayúsculas/minúsculas mezcladas). Ver stackoverflow discussion y MSDN Enumeration Type Naming Guidelines.

Como estamos intercambiando datos con un sistema C#, estoy tentado de copiar sus enumeraciones exactamente, ignorando las convenciones de Java de que "las constantes tienen nombres en mayúscula". Al pensar en ello, no veo mucho valor en restringirme a mayúsculas para las instancias enum. Para algunos fines .name() es un atajo útil para obtener una representación legible de una constante enum y un nombre de caso mixto se vería mejor.

Entonces, sí, me atrevo a cuestionar el valor de la convención de nomenclatura enum de Java. El hecho de que "la otra mitad del mundo de la programación" sí utiliza un estilo diferente me hace pensar que es legítimo dudar de nuestra propia religión.

+28

+1: duda nuestra propia religión – BLeB

+3

** TIL ** que solo los programadores Java o C# son programadores reales, y que sus números son iguales.#sarcasm – Mindwin

+1

también, todas las mayúsculas se ven feas ... – Nyerguds

11

Como ya se indicó, las instancias enum deberían estar en mayúsculas de acuerdo con los documentos en el sitio web de Oracle (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html).

Sin embargo, mientras que mirando a través de un tutorial JavaEE7 en el sitio web de Oracle (http://www.oracle.com/technetwork/java/javaee/downloads/index.html), me encontré con tutorial de la "de Duke librería" y en una clase (tutorial\examples\case-studies\dukes-bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java), me encontré con la siguiente definición de enumeración:

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

de acuerdo con las convenciones, debe haber parecido:

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

Por lo que parece, incluso los chicos de Oracle convención veces comercian con la conveniencia.

Cuestiones relacionadas