java - standard - Convenciones de codificación-nombrar enumerados
java codification standard (7)
¿Hay alguna convención para nombrar enumeraciones en Java?
Mi preferencia es que una enumeración es un tipo. Así, por ejemplo, tienes 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 seleccionar qué archivos son enumerados, pero también tendrías que:
NetworkConnectionClass
FruitClass
Además, ¿hay un buen documento que describa lo mismo para las constantes, dónde declararlas, etc.?
Como ya se indicó, las instancias de enumeración deben 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 miraba un tutorial de JavaEE7 en el sitio web de Oracle ( http://www.oracle.com/technetwork/java/javaee/downloads/index.html ), tropecé con el tutorial de la "librería de Duke" y en una clase ( tutorial/examples/case-studies/dukes-bookstore/src/main/java/javaeetutorial/dukesbookstore/components/AreaComponent.java
), encontré la siguiente definición de enumeración:
private enum PropertyKeys {
alt, coords, shape, targetImage;
}
Según las convenciones, debería 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;
}
}
Así que parece que incluso los chicos de Oracle a veces intercambian convenciones con conveniencia.
En nuestra base de código; Normalmente declaramos enumeraciones en la clase a la que pertenecen.
Entonces, para su ejemplo de Fruta, tendríamos una clase de Fruta, y dentro de ella un Enum llamado Frutas.
La referencia en el código tiene este aspecto: Fruit.Fruits.Apple, Fruit.Fruits.Pear
, etc.
Las constantes siguen en la misma línea, donde o bien se definen en la clase a la que son relevantes (por lo tanto, algo como Fruit.ORANGE_BUSHEL_SIZE
); o si se aplican en 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; entonces YMMV.
Las enumeraciones son clases y deben seguir las convenciones para las clases. Las instancias de una enumeración son constantes y deben seguir las convenciones para constantes. Asi que
enum Fruit {APPLE, ORANGE, BANANA, PEAR};
No hay razón para escribir FruitEnum más que FruitClass. Solo está desperdiciando cuatro (o cinco) caracteres que no agregan información.
Java mismo recomienda este enfoque y se utiliza en sus ejemplos .
Probablemente esto no me hará muchos nuevos amigos, pero debería agregarse que las personas de C # tienen una pauta diferente: las instancias de enumeración son "caso Pascal" (mayúsculas y minúsculas). Consulte la discusión sobre el y las Pautas de nomenclatura de tipos de enumeración de MSDN .
Como estamos intercambiando datos con un sistema C #, me siento tentado a copiar sus listas exactamente, ignorando la convención de "las constantes tienen nombres en mayúscula" de Java. Pensando en ello, no veo mucho valor en estar restringido a mayúsculas para instancias de enumeración. Para algunos propósitos, .name () es un atajo útil para obtener una representación legible de una constante de enumeración y un nombre de caso mixto se vería mejor.
Entonces, sí, me atrevo a cuestionar el valor de la convención de denominación de enumeración de Java. El hecho de que "la otra mitad del mundo de la programación" realmente use un estilo diferente me hace pensar que es legítimo dudar de nuestra propia religión.
Si puedo agregar mis $ 0.02, prefiero usar PascalCase como valores de enumeración en C.
En C, son básicamente globales, y PEER_CONNECTED se vuelve realmente agotador en comparación con PeerConnected.
Un respiro de aire fresco.
Literalmente, me hace respirar más fácil.
En Java, es posible utilizar nombres de enumeración sin formato siempre que los importe de forma estática desde otra clase.
import static pkg.EnumClass.*;
Ahora, puede usar los nombres no calificados, que ya calificó de una manera diferente.
Actualmente estoy (pensando) en portar un código C a Java y actualmente estoy "desgarrado" entre elegir la convención de Java (que es más detallada, más extensa y más fea) y mi estilo C.
PeerConnected se convertiría en PeerState.CONNECTED, excepto en las instrucciones de cambio, donde está CONECTADO.
Ahora hay mucho que decir sobre esta última convención y se ve bien, pero ciertas "frases idiomáticas" como if (s == PeerAvailable)
vuelven como if (s == PeerState.AVAILABLE)
y, nostálgicamente, esto es una pérdida de significado. a mi.
Creo que todavía prefiero el estilo Java debido a la claridad, pero me cuesta mucho ver el código que grita.
Ahora me doy cuenta de que PascalCase ya se usa ampliamente en Java, pero muy confuso en realidad no lo sería, solo un poco fuera de lugar.
Siguen siendo 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 está mal y necesita nombres más descriptivos. Estoy tratando de pensar en el tipo de código que llevaría a necesitar ambos, y parece que debería haber una clase base de Fruit
con subtipos en lugar de una enumeración. (Aunque solo es mi propia especulación, puede que tengas una situación diferente de la que estoy imaginando).
La mejor referencia que puedo encontrar para nombrar constantes proviene del tutorial de Variables :
Si el nombre que elige consta de una sola palabra, deletree esa palabra en letras minúsculas. Si consta de más de una palabra, escribe con mayúscula la primera letra de cada palabra subsiguiente. 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, capitaliza cada letra y separa las palabras posteriores con el carácter de subrayado. Por convención, el carácter de subrayado nunca se utiliza en otros lugares.
enum MyEnum {VALUE_1,VALUE_2}
es (aproximadamente) como decir
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 }
}
así que supongo que todas las mayúsculas son estrictamente más correctas, pero aún uso la convención de nombres de clase ya que odio todas las mayúsculas donde sea