0

私は(初めて)依存性注入を使用してトークンを構築しようとしています。ダイアモンド階層の問題があり、データの署名付きハッシュを実際のデータ自体の前に追加する必要があります。

その結果、元のデータプロバイダーでget()を複数回呼び出していることに気付きました。これは問題ありませんが、グラフのさらに下には時間ベースのコンポーネントがあり、その結果、後続の呼び出しで返されるデータは異なります。

シングルトンプロバイダーモデルを使用するソリューションが提案されました。このプロバイダーの場合、get()を後で呼び出すと、同じオブジェクト(参照)が返されます。このプロバイダーは、get()の最初の呼び出しの結果をキャッシュし、それを継続的に返します。依存関係を注入するとき、このプロバイダーの同じインスタンスを2回注入すると、その結果、同じデータが2回返されます。

これは私に考えさせられました、あなたがシングルトンプロバイダーを使いたくない状況はありますか?別の結果が予想される場合は、毎回新しいプロバイダーインスタンスを作成する必要がありますか?

public MyUnderscoreStringSingletonProvider implements Provider<String>
{
    private final Provider<String> mySomeOtherStringProvider;
    private String myCachedString;

    public MyUnderscoreStringSingletonProvider( 
        Provider<String> someOtherStringProvider )
    {
        mySomeOtherStringProvider = someOtherStringProvider;
        myCachedString = null;
    }

    @Override
    public String get()
    {
        if( myCachedString == null )
        {
            myCachedString = create();
        }
        return myCachedString;
    }

    private String create()
    {
        return "_" + mySomeOtherStringProvider.get();
    }
}

// ...

public class SomeCoolService
{
    // ...

    public Provider<String> injectStringDoubler()
    {
        final Provider<String> stringProvider = 
            injectUnderScoreStringProvider();
        return new TwoConcatendatedStringsProvider(
            stringProvider,
            stringProvider );
        // This would not work if Singleton Provider was not used.
        // Why should we ever use non-Singleton Providers?
    }

    protected Provider<String> injectUnderScoreStringProvider()
    {
        return new MyUnderscoreStringSingletonProvider(
            injectMyTimebasedStringProvider() // returns different result
                                              // depending
                                              // on time.
            );
    }

    // ...
}
4

1 に答える 1

1

オブジェクトを初期化して最初から作成するには、2つの方法があります。もう1つは、既存のオブジェクトを初期状態にリセットすることです。

最終的には、ソフトウェア開発に関する他の多くのことと同様に、関連するコストの見積もりになります。

シングルトンは実装が簡単で、ほとんどの場合、リソース効率の高いソリューションを提供しますが、スレッドセーフでない状態では使用できません。たとえば、シングルトンとしてのSimpleDateFormatは、「ランダムな」エラーを提供します。

オブジェクトプールは、オブジェクトの作成コストがリセットよりも大幅に高い状況で役立ちますが、実装するのは簡単ではないため、既製のオブジェクトがなく、実装する差し迫った理由がない場合は、通常のオブジェクトの作成/破棄フローに従うのがより良いアプローチです。

于 2013-03-05T21:38:10.690 に答える