java - uppercamelcase - ¿Debo usar mayúsculas o camelcase en las enumeraciones de etiquetas?
notacion camelcase java (2)
El título lo dice todo.
En Cypher, el camelcase se usa para etiquetas. Por ejemplo :Car
y :Bike
. Los documentos API para Label
usan mayúsculas al definir cada etiqueta en la enumeración, por lo que Label.CAR.name()
siempre será CAR
, no Car
.
El uso de camelcase se ajusta más a las consultas de cifrado, pero esto entra en conflicto con el estándar de Java para nombrar miembros enum. Esto me obliga a usar etiquetas como Label.BIKE_SEAT
lugar de Label.BikeSeat
en mi base de datos de gráficos. ¿Cuál debería usar?
A pesar de que usar mayúsculas para los miembros de enum es la forma correcta de hacerlo en Java, todavía tengo un poco de curiosidad sobre por qué las personas Neo4j decidieron representar las etiquetas como enumeraciones.
ORACLE DOC: Because they are constants, the names of an enum type''s fields are in uppercase letters.
cheque: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
Primer acercamiento a una solución
Para cumplir con la convención de Java, puedo anular Enum#toString()
y usar eso en lugar de Enum#name()
que no se puede anular. Entonces cada miembro tendrá un constructor con su etiqueta real Neo4j como se representa en la base de datos de gráficos:
public enum Label implements org.neo4j.graphdb.Label {
CAR("Car"),
BIKE("Bike"),
BUS("Bus");
private String name;
private Label(name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
Esto no funciona bien con métodos como GraphDatabaseService#findNodesByLabelAndProperty(Label, String, String)
porque parece estar usando Label#name()
para coincidir en lugar de Label#toString()
por lo que no coincidirá con nodos que tengan camel case etiquetas en el db.
Mi solución de trabajo
Como la anulación de Enum#toString()
no funciona y dado que Neo4j usa Label#name()
para todo internamente, tendré que sobrescribirlo de todos modos. Así que terminé definiendo una clase que implementaba Label
que puede anular Label#name()
:
public class Label implements org.neo4j.graphdb.Label {
public static final Label CAR = new Label("Car");
public static final Label BIKE = new Label("Bike");
public static final Label BUS = new Label("Bus");
private String name;
private Label(String name) {
this.name = name;
}
@Override
public String name() {
return name;
}
@Override
public String toString() {
return name;
}
}
Externamente, no se necesitan cambios en el lado del cliente utilizando la etiqueta previa enum.