2011-08-06 3 views
5

私は現在、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

興味深い。以前は、列挙型を使ってメタデータの便利な部分を持ち歩いてきましたが、実行可能なコードを格納することはこれまでにはありませんでした。

これまで述べたように、新しいVectorVisualization実装を作成するときは、手動で列挙に新しいエントリを追加する必要があります。一般的に私は可能な限り手動でオーバーヘッドを避けることを好みますが、実際にはそれは個人的な好みの問題です。

あなた(およびあなたとこのコードで作業しているすべての人)がこの制約を認識していて気にしない場合は、あなたの解決策は問題ないと思います。

VectorVisualizationは、VectorVisualizationをすべて列挙型で参照するすべての人に渡されるインスタンスが1つだけ存在するため、すべてのVectorVisualizationがスレッドセーフな方法で実装されている必要があります。これが問題の場合は、インプリメンテーションクラスをインプリメンテーションインスタンスではなく列挙体に格納し、getVisualization()を変更して、呼び出されたときに関連付けられたインプリメンテーションクラスの新しいインスタンスを作成するだけです。これにより、VectorVisualization実装に対して追加の制限が設けられ、実装の使用可能なインスタンスを作成するpublic 0パラメータコンストラクタをそれぞれ提供する必要があります。

+0

あなたの答えをありがとう!これはスレッドセーフティの良い点です。しかし、私たちの場合、それは問題ではありません。同様の機能を提供するもう1つの方法は、enumをキーとして使用し、VectorVisualizationを値として使用するマップを使用することです。しかし、新しい実装を追加するときは、enumで1つではなく2つのコードの場所で定義する必要があります。だからまだenum側にあります:)。 – Prine

+0

@Prine - これまではマップベースのアプローチを何度も使用してきましたが、enumで行ったことと比べて何のメリットもありません(実行時にマップに新しいエントリを動的に追加したり、そして/または既存のものを削除する)ので、私はそれを持ち出さなかった。私が必要とする次回は、代わりにenumベースのアイデアを試してみるかもしれません。 – aroth

1

現在の実装を列挙するためには、非常に優れたプロパティがいくつかあります。例えば。列挙宣言に定義されていなければならず、実装にアクセスするための標準のenumインターフェイスを持つ必要があるため、すべての現在の実装を見つけるのはかなり簡単です。

しかし、現在のセットをプラグイン可能な方法で拡張することもできないため、第三者が新しい実装を追加することはできません。このため、私は通常、すべての実装を保持するシングルトンマネージャを使用したいと考えています。このパターンは、OSGiのような多くのコンポーネントフレームワークでもうまくいきます。

関連する問題