我应该在标签枚举中使用大写字母还是camelcase?

时间:2014-04-14 10:54:43

标签: java enums neo4j cypher

标题说明了一切。

cypher中,camelcase用于标签。例如:Car:BikeLabel的API文档在枚举中定义每个标签时使用大写,因此Label.CAR.name()始终为CAR,而不是Car

使用camelcase更适合cypher查询,但这与命名枚举成员的Java标准相冲突。这迫使我在我的图形数据库中使用Label.BIKE_SEAT而不是Label.BikeSeat之类的标签。我应该使用哪一个?

尽管使用大写字母作为枚举成员是用Java做的正确方法,但我仍然有点好奇为什么Neo4j的人决定将标签表示为枚举?

2 个答案:

答案 0 :(得分:6)

ORACLE DOC:Because they are constants, the names of an enum type's fields are in uppercase letters.

检查:http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

答案 1 :(得分:3)

解决方案的第一种方法

为了符合Java惯例,我可以覆盖Enum#toString()并使用它而不是Enum#name(),但不能覆盖它。然后每个成员都有一个构造函数,其中包含真正的Neo4j标签,如图数据库中所示:

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

这对于GraphDatabaseService#findNodesByLabelAndProperty(Label, String, String)等方法效果不佳,因为它似乎使用Label#name()进行匹配而不是Label#toString(),因此它不会匹配具有驼峰案例标签的节点db。

我的工作解决方案

由于覆盖Enum#toString()不起作用,并且由于Neo4j在内部使用Label#name(),所以无论如何我都需要覆盖它。所以我最终定义了一个实现Label的类,它可以覆盖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;
  }
}

在外部,使用以前的标签枚举不需要在客户端进行任何更改。