共享单例

The*_*dor 3 java singleton design-patterns

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

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

SomeUtil util = new SomeUtil();

...

Foo foo = new Foo(util, arg1, arg2)
Bar bar = new Bar(util, arg3, arg4, arg5) 
Run Code Online (Sandbox Code Playgroud)

有没有更优雅的方式来实现这个(即设计模式)?

Pét*_*rök 5

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

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

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