私は現在、3D環境で一連のベクトルを表現する必要があるプロジェクトに取り組んでいます。我々はいくつかの異なる視覚化の実装を持っています。enumを実装コンテナとして使用する
私はアイデアに来て、すべての可視化タイプを列挙型でバンドルすることができました。私はInterface VectorVisualizationと、このインタフェースを実装するいくつかの実装を定義しました。
は今、私はインターフェイスクラスに次の列挙型を追加しました:
public interface VectorVisualization {
public enum VectorVisualizationType {
CYLINDER(new VectorVisualizationCylinder(), "Cylinder"),
CONES(new VectorVisualizationCones(), "Cones"),
FATCONES(new VectorVisualizationFatCones(), "Fat cones"),
ARROWS(new VectorVisualizationArrows(), "Arrows");
private final String label;
private final VectorVisualization vis;
VectorVisualizationType(VectorVisualization vis, String label) {
this.vis = vis;
this.label = label;
}
public VectorVisualization getVisualization() {
return this.vis;
}
public String getLabel() {
return this.label;
}
}
void prepareVBO(GL gl, ArrayList<VectorData> vectors, VectorField field);
void render(GL gl);
void clearOldVBOS(GL gl);
}
ラベルはGUIでJComboBoxのためのものです。だから今、列挙型を繰り返して、さまざまなタイプのラベルを取得することができます。また、実装を設定するために、私はそのようなenumを使用することができます:
VectorVisualizationType.CYLINDER.getVisualization()
これは良い方法ですか?あるいは、そのアプローチに何か問題がありますか?もちろん、新しい実装を作成した時点で、これを列挙型に追加する必要があります。
ご意見ありがとうございます。
あなたの答えをありがとう!これはスレッドセーフティの良い点です。しかし、私たちの場合、それは問題ではありません。同様の機能を提供するもう1つの方法は、enumをキーとして使用し、VectorVisualizationを値として使用するマップを使用することです。しかし、新しい実装を追加するときは、enumで1つではなく2つのコードの場所で定義する必要があります。だからまだenum側にあります:)。 – Prine
@Prine - これまではマップベースのアプローチを何度も使用してきましたが、enumで行ったことと比べて何のメリットもありません(実行時にマップに新しいエントリを動的に追加したり、そして/または既存のものを削除する)ので、私はそれを持ち出さなかった。私が必要とする次回は、代わりにenumベースのアイデアを試してみるかもしれません。 – aroth