web-dev-qa-db-ja.com

Springアプリケーションのユーティリティクラス-静的メソッドを使用する必要がありますか?

ユーティリティクラスDateUtil(以下を参照)があるとします。このメソッドを使用するには、呼び出し元のメソッドでDateUtils.getDateAsString(aDate)を使用します。 static修飾子を削除し、DateUtilをSpring Bean(DateUtilsBeanを参照)にして、呼び出し元のクラスに挿入するか、そのままにしておく方が良いでしょうか?

Staticを使用する際に見られる1つの欠点は、モッキングに関する問題です( staticメソッドでモックする方法は? を参照してください)

public class DateUtils {

    public static String getDateAsString(Date date) {       
        String retValue =  "" // do something here using date parameter
        return retValue;
    }
}

Spring Beanバージョン

@Component
public class DateUtilsBean {

    public String getDateAsString(Date date) {      
        String retValue =  "" // do something here using date parameter
        return retValue;
    }
}
50
eon

私はそうは思いません。 DateUtilsクラスは、副作用がなく、入力パラメーターを処理するだけの純粋なユーティリティクラスのように聞こえます。この種の機能は、静的メソッドに残っている場合もあります。日付ヘルパーメソッドをモックしたいと思うことはあまりありません。

29

私はショーン・パトリック・フロイドに同意します。

これが私の基準です。クラスのメソッドが、受け取ったパラメーターに対してのみ実行し、外部の依存関係(データベース、ファイルシステム、ユーザー構成、その他のオブジェクト/ Beanなど)がない場合、静的メソッドを使用します。 、通常はプライベートコンストラクタを持つ最終クラスです。

それ以外の場合は、Spring Beanを使用して実装します。

したがって、あなたが提起する場合、この基準に従って、静的メソッドを含むクラスを記述します。

よろしく。

13
Alberthoven

そのライフサイクルはSpringによって管理されるため、Spring Beanとして宣言する方が適切です。最終的には依存関係を注入し、オブジェクトをプールし、適切な方法でテストすることができます。これを通常のオブジェクトとして使用し、パラメーターとして渡し、サブクラスでメソッドを再定義します...など。

要するに、はい、ほとんどの場合、それはより良い設計です。それでも、露出したものと同じくらい単純な場合では、大きな違いはありません。

9
Mr.Eddart