2010-12-06 14 views
8

Google Guiceでユーティリティメソッドを挿入するのが良い方法であるかどうか疑問に思っています。Google Guiceと静的メソッドを使ってUtilクラスを注入しますか?

のは、我々は変換ユーティリティクラスがあるとしましょう:

public class UtilClass 
{ 
    public static Result convert(Source src) 
    { 
    //Do conversion 

    return result; 
    } 
} 

私の考えはで構築されたアプリケーションのために推奨される方法この

@Singleton 
public class UtilClass 
{ 
    public Result convert(Source src) 
    { 
    //Do conversion 

    return result; 
    } 
} 

のようにシングルトンとして、このユーティリティを注入するGuiceのを使用することですguice?

答えて

11

お客様のconvert()メソッドの性質によって異なります。

それは決定論

  • シンプル
  • (つまりは、追加のパラメータに依存しない)
  • 副作用
  • を持っていない何かなら
  • など
を変更することはほとんどありません

静的ユーティリティメソッドとしてそのまま使用できます。

それ以外の場合は、それをより明確にするために、ConversionServiceに改名してください。

4

まず、あなたが持っている静的メソッドを使い続けるのではなく、このユーティリティクラスのインスタンスを注入するのはどうですか?インプットとアウトプットを持ち、副作用のない関数は、しばしば静的メソッドとして最適です。それは、おそらく、あなたはこのメソッドがテストや何かのために何をするかを変更できるようにしたいと言いました。その場合は、通常、クラスにクライアントクラスで使用するインタフェースを実装させたいと考えています。

いずれにせよ、UtilClassがステートレスの場合は、ではなく、をシングルトンとして挿入します。非シングルトンを注入するほうがシングルトンを注入するほうが速い。多分、注入されたインスタンスを他の多くのクラスに格納しようとするなら、スペースを節約するためにシングルトンが理にかなっているかもしれません。

+0

シングルトン注入の問題を明確にしてくれてありがとう! –

3

個人的に私は、通常、依存性注入フレームワークを使用してアプリケーションが配線されているという事実を私がクラスなどに対して行う決定に影響させないようにしようとしています。あなたのケースでは、あなたのユーティリティクラスは状態に依存しないように見えるので、静的なままにすることは賢明な候補に思えます。

これに関係なく、ユーティリティクラスはどのインタフェースも実装されていないため、それを使用するクライアントコードは依然として密接に結合されています。これにより、クライアントコードで静的クラスを直接参照するのではなく、DIを使用してユーティリティクラスを注入する利点は何かを知ることは困難です。

関連する問題