使用@Singleton
注释的班级是否必须遵循Singleton design pattern?
我的猜测是他们没有:没有必要使用私有构造函数和static .instance()
方法,而是Guice确保只实例化该类的一个实例。 / p>
答案 0 :(得分:7)
他们不仅不需要遵循Singleton模式,而且明确不应该遵循它。
使用Guice正确设置的系统应该尽可能少地创建自己的对象,而不是让框架完成所有对象的创建。此外,您不希望系统中的随机类在此静态实例上调用 .instance()
,最后,您不希望Guice创建使用.requestStaticInjection()
在Singleton类中的静态引用。
使用@Singleton
类正确的做法是将它们注入需要该特定依赖项的类中。
答案 1 :(得分:3)
Guice中的单身人士和常规单身人士之间的区别与上下文有关。
当你不使用Guice时,你必须自己管理你的单身人士。要确保只创建一个实例,您将拥有一个私有构造函数,一个静态字段和访问此实例的方法(getter或使字段成为final)。这意味着实例是类加载器上下文中的单例。如果你创建另一个类加载器并告诉它加载你的单例类,你可以创建第二个实例。
当单例由Guice管理时,我们用@Singleton
注释替换私有构造函数和静态字段,告诉注入器它应该只创建此类的一个实例并使用它在任何需要的地方。由于可以同时拥有多个注入器(因为您需要两个完全不同的上下文或者因为您正在使用子注入器),因此不得阻止Guice实例化多个实例你的班级。
此外,由于您应该依赖Guice在任何地方提供单例,因此不需要包含单例实例的静态字段,因为它永远不会被访问。