ラベルの列挙型には大文字とキャメルケースを使用する必要がありますか?
質問
タイトルがすべてを物語っています。
で 暗号, 、ラベルにはキャメルケースが使用されます。例えば :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