繁体   English   中英

共享单例实例

[英]Shared singleton instance

我正在实现一个使用具有单例行为的共享实用程序类的程序。

实用程序类的一个实例在主线程中创建,并传递给实例化的所有其他对象:

SomeUtil util = new SomeUtil();

...

Foo foo = new Foo(util, arg1, arg2)
Bar bar = new Bar(util, arg3, arg4, arg5) 

是否有更优雅的方式来实现这一点(即设计模式)?

你为什么绕过实用工具? SomeUtil可以有静态方法,因此Foo和bar中的方法可以使用它。

此外,您可以实现实际的单例模式。

正如其他人所提到的,Singleton可以替代。 请注意,您当前的设计很容易进行单元测试(因为您正在注入SomeUtil依赖项,因此在单元测试期间可以很容易地被模拟对象替换),而Singleton使得单元测试变得笨拙和困难:

  • 它使你的对象依赖于全局状态,因此更难以正确设置测试,并且容易出错(例如,忘记为特定测试正确初始化Singleton),
  • 理解代码更加困难,因为除了实际读取整个代码之外,您无法轻易识别给定的代码片段是否依赖于全局状态。

话虽这么说,如果它是一个真正的实用类,即它没有内部状态,并且它不依赖于任何会使单元测试变得困难的东西(如数据库或文件系统),可以将它用作一个Singleton(虽然这引出了一个问题,为什么你需要实例化它 - 通常实用程序类只有静态方法,而私有构造函数来防止实例化)。

好吧,你实际上可以使用单例模式 ,它通常在类本身中存储对单个实例的静态引用。

public class SomeUtil {
    private static final SomeUtil instance = new SomeUtil();
    public static SomeUtil getInstance() { 
        return instance;
    }
    //...
}

这样做可以减少单元测试,所以要注意。 打破注入的依赖项通常比全局依赖项容易得多。

为什么不只是一个真正的单身人士? 比在任何地方传递一个实例要好得多。

可能最好的解决方法是添加/使用一些依赖注入框架。

  • 框架将保证对象确实是单例(传统上有点棘手,特别是在以懒惰方式完成时)
  • 你可以在测试时替换/控制单例'实例'
  • 你可以摆脱singleton-passed-as-constructor-parameter(如果你想)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM