2009-08-27 17 views
1

私は入力を取り、出力として構成ファイルを生成するアプリケーションを持っています。正確な入力または出力形式は時間の経過とともに変化する可能性があるので、私は2つのインタフェース、すなわち輸入者と輸出者を定義しました。Javaで子クラスのパラメータを初期化するのに適した方法は?

各コンクリート輸入業者または輸出業者は、動作するために初期化する必要があるさまざまなパラメータを持つことができます。たとえば、インポートデータがCSVファイルから来ている場合は、ファイルのパスのみが必要ですが、データがデータベースから来ている場合は、接続文字列、ユーザー名、パスワードなどが必要です。

私の実装では、現在、次のとおりです。

public interface Importer { 
    public void setup(Map<String,String> params); 
    public List<ConfigEntry> getList(); 
} 

public interface Exporter { 
    public void setup(Map<String,String> params); 
    public void writeDocument(List<ConfigEntry> entries) throws IOException; 
} 

設定方法は、GETLIST(前に呼び出される必要がある)、またはwriteDocument()を呼び出すことができます。各子クラスは異なるパラメータを持つことができるため、マップを使用してパラメータを保持します。

JavaBeanスタイルのパラメータの初期化が優先されますか?これは、setConnnectionString()、setCSVFilePath()、setX()を各子クラスに追加することを意味します。

これらのアプローチの利点と欠点は何ですか?

+0

...それが依存...です。 –

答えて

1

するには、2つの明らかな欠点があるマップがベースのアプローチ:明確に定義されたパラメータ名の

  1. 不在。はい、どこかで定数として定義できますが、渡されたパラメータ名が有効であることを確認する必要があります。
  2. 明確に定義されたパラメータタイプの不在。さらに悪いことに、もし整数を渡す必要があれば、それをStringに変換しなければならず、それを解析しなければならない可能性があります。 Map<String,Object>と自動バウンディングを使用することでやや緩和できますが、それでも適切なタイプを検証する必要があります。

セッターベースのアプローチには1つの欠点しかありません。実行できません。つまり、セッターを使用して確実に行うことはできませんALONE - すべての設定者の後に呼び出される何らかの種類のinit()またはafterPropertiesSet()メソッドを追加する必要があり、追加の(共依存)検証を実行できます初期化ステップ。

また、このようなものは実際に何らかの種類のDependency Injectionフレームワークを求めています。例えば、Springのようになります。

0

コンストラクタでMap(またはProperties)オブジェクトを渡すことは、必ずしも子クラス固有の設定より優先されるとは言えません。どのアプローチが最良かは、クラスをどのようにインスタンス化するかによって決まります。

Javaから直接クラスをインスタンス化する場合は、マップの組み立て方が良い場合は特に、マップのアプローチが希薄になりがちです。 (たとえば、プロパティファイルからPropertiesオブジェクトを読み込む) 'setters'アプローチでは、それぞれの子クラスAPIに対してコードを記述する必要があります。

一方、 "配線"、 "制御の逆転"など(例えばSpring、PicoContainer、JavaBeansなど)をサポートするいくつかのコンテナフレームワークを使用してクラスをインスタンス化する場合、セッターは一般により良い。フレームワークは通常、クラスをインスタンス化してセッターを呼び出す時と方法を処理し、その作業のためにフードの下の反射を使用します。

だから、答えは両方@Stephen Cによって及びChssPly76 @述べたように、依存性注入フレームワークを使用すると、最近「好ましい」ソリューションです

関連する問題