0

我正在尝试(第一次)使用依赖注入来构建令牌。我有一个菱形层次结构问题,我需要将我的数据的签名哈希添加到实际数据本身。

结果,我发现自己多次在原始数据提供者上调用 get()。这很好,但在图表的下方,有基于时间的组件,因此,后续调用返回的数据是不同的。

建议使用 Singleton Provider 模型的解决方案。对于此 Provider,对 get() 的后续调用返回相同的对象(引用)。此 Provider 缓存第一次调用 get() 的结果并不断返回该结果。在注入依赖项时,我两次注入此提供程序的同一个实例,结果它两次返回相同的数据。

这让我想到,有没有什么情况你不想使用 Singleton Provider?如果你期待不同的结果,不应该每次都创建一个新的 Provider 实例吗?

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

初始化对象有两种方法,一种是从头开始创建它。另一种是将现有对象重置为其初始状态。

最终,就像软件开发中的许多其他事情一样,它归结为对所涉及的成本的估计。

单例很容易实现,并且在大多数情况下提供了一种资源高效的解决方案,但是它们不能在非线程安全的条件下使用。例如,SimpleDateFormat 作为单例将提供“随机”错误。

对象池在这些情况下很有用遵循正常的对象创建/销毁流程是更好的方法。

于 2013-03-05T21:38:10.690 回答