Guice @Singleton 必须遵循 Singleton 设计模式吗?
Do Guice @Singleton have to follow the Singleton design pattern?
class是否用 @Singleton
have to follow the Singleton design pattern 注释了?
我的猜测是他们没有:没有必要有私有构造函数和 static .instance()
方法,而是 Guice 确保 [=17= 的只有一个实例] 将被实例化。
他们不仅不需要遵循单例模式,而且明确地不应该遵循它。
使用 Guice 正确设置的系统应该尽可能少地创建自己的对象,而不是让框架完成所有对象的创建。此外,您不希望系统中的随机classes在这个静态实例上调用.instance()
,并且,最后,您不希望 Guice 使用 .requestStaticInjection()
.
在 Singleton class 中创建静态引用
对 @Singleton
classes 的正确处理是将它们注入到需要特定依赖项的 classes 中。
Guice 中的单例与常规单例的区别与上下文有关。
当你不使用 Guice 时,你必须自己管理你的单例。为确保只创建一个实例,您有一个私有构造函数、一个静态字段和访问该实例的方法(getter 或使该字段成为最终字段)。这意味着该实例在 class 加载程序 的上下文中是一个单例 。如果你创建另一个 class 加载器并告诉它加载你的单例 class 你可以创建第二个实例。
当单例由 Guice 管理时,我们用 @Singleton
注释替换私有构造函数和静态字段,告诉注入器它应该只创建 one 实例这个 class 并在任何需要的地方使用它。由于可能同时拥有多个注入器(要么因为您需要两个完全不同的上下文,要么因为您使用的是子注入器),因此您不得阻止 Guice 实例化多个实例你的 class.
此外,由于您应该依靠 Guice 在任何需要的地方提供单例,因此不需要包含单例实例的静态字段,因为它永远不会被访问。
class是否用 @Singleton
have to follow the Singleton design pattern 注释了?
我的猜测是他们没有:没有必要有私有构造函数和 static .instance()
方法,而是 Guice 确保 [=17= 的只有一个实例] 将被实例化。
他们不仅不需要遵循单例模式,而且明确地不应该遵循它。
使用 Guice 正确设置的系统应该尽可能少地创建自己的对象,而不是让框架完成所有对象的创建。此外,您不希望系统中的随机classes在这个静态实例上调用.instance()
,并且,最后,您不希望 Guice 使用 .requestStaticInjection()
.
对 @Singleton
classes 的正确处理是将它们注入到需要特定依赖项的 classes 中。
Guice 中的单例与常规单例的区别与上下文有关。
当你不使用 Guice 时,你必须自己管理你的单例。为确保只创建一个实例,您有一个私有构造函数、一个静态字段和访问该实例的方法(getter 或使该字段成为最终字段)。这意味着该实例在 class 加载程序 的上下文中是一个单例 。如果你创建另一个 class 加载器并告诉它加载你的单例 class 你可以创建第二个实例。
当单例由 Guice 管理时,我们用 @Singleton
注释替换私有构造函数和静态字段,告诉注入器它应该只创建 one 实例这个 class 并在任何需要的地方使用它。由于可能同时拥有多个注入器(要么因为您需要两个完全不同的上下文,要么因为您使用的是子注入器),因此您不得阻止 Guice 实例化多个实例你的 class.
此外,由于您应该依靠 Guice 在任何需要的地方提供单例,因此不需要包含单例实例的静态字段,因为它永远不会被访问。