ラベルの列挙型には大文字とキャメルケースを使用する必要がありますか?

StackOverflow https://stackoverflow.com//questions/23058275

  •  26-12-2019
  •  | 
  •  

質問

タイトルがすべてを物語っています。

暗号, 、ラベルにはキャメルケースが使用されます。例えば :Car そして :Bike. 。API ドキュメント Label 列挙型の各ラベルを定義するときに大文字を使用するため、 Label.CAR.name() 常になります CAR, 、 ない Car.

キャメルケースを使用すると暗号クエリにより適切に適合しますが、これは列挙型メンバーの命名に関する Java 標準と競合します。これにより、次のようなラベルを使用する必要があります Label.BIKE_SEAT の代わりに Label.BikeSeat 私のグラフデータベースにあります。どれを使えばいいのでしょうか?

Java では enum メンバーに大文字を使用するのが正しい方法ですが、なぜ Neo4j の人がラベルを enum として表現することにしたのか、少し疑問に思っています。

役に立ちましたか?

解決 2

解決への最初のアプローチ

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() したがって、データベース内のキャメルケースラベルを持つノードとは一致しません。

私の実用的なソリューション

オーバーライドしてから 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;
  }
}

外部的には、以前のラベル enum を使用するクライアント側で変更を行う必要はありません。

他のヒント

オラクルドキュメント: 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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top