如何正确创建和关闭功能
How to properly create and shutdown a feature
我正在开发一项可以由用户启用和禁用的功能。
它是在一个单独的模块中实现的,它创建了一些线程和一些单例。
因为我有一个单独的模块,并且我们打算稍后在一个单独的过程中 运行 它,所以我为它使用了一个单独的 guice 注入器。
所以我有一个创建注入器的工厂方法和 returns 一个 class 实现功能接口(它有 3 个接口)
public class FeatureFactory {
private Injector injector;
public FeatureClass open() {
injector = createInjector();
return injector.getInstance(FeatureClass.class);
}
}
public class FeatureClass implements InterfaceA, InterfaceB, InterfaceC {
}
问题:
- 在这种情况下创建一个新的注入器是好的做法吗?我的意思是当整个功能驻留在一个单独的模块中时?
想法是将它们解耦,而不是将新功能 guice 模块作为功能的一部分 API.If 不是,更好的方法是什么?
- 返回功能 class 而不是接口的味道不太好。
它让用户了解实现
我该如何克服这个问题?
目前我使用应用程序 guice 模块将接口绑定到 FeatureClass
- 如何关闭该功能并收集所有 classes 垃圾?
正如我所说,打开该功能时,会创建一些单例和线程。
如果我将注入器字段设置为空,这是否意味着所有内容都会被垃圾收集?
创建多个注入器通常不是一个好主意。单例在一个注入器中的范围内,因此当您创建多个注入器时,您的单例不再是单例。
相反,创建一个允许调用者创建 class 实例的工厂 class,并向该工厂注入一个 Provider<FeatureClass>
@Singleton
public class FeatureClassFactory {
private final Provider<FeatureClass> provider;
private FeatureClass instance;
@Inject
FeatureClassFactory(Provider<FeatureClass> provider) {
this.provider = provider;
}
public synchronized FeatureClass get() {
if (instance == null) {
instance = provider.get();
}
return instance;
}
}
当然,您可以使用单例 Provider<FeatureClass>
作为 API 而不是创建工厂,但是 1) 我不喜欢在我的 public 中使用 Guice 接口APIs 和 2) 在生产模式下,初始化注入器时会创建单例,而你说你想延迟创建 FeatureClass
个实例。
至于返回实现与 class,哪个更好是一个有争议的问题,取决于用例和您的编码风格。
最后,由于单例在注入器范围内,注入器保持对所有单例的强引用。如果您需要在应用程序的生命周期内释放内存,则必须通过将字段设置为 null
and/or 清除集合来让 classes 释放内存。
我正在开发一项可以由用户启用和禁用的功能。 它是在一个单独的模块中实现的,它创建了一些线程和一些单例。 因为我有一个单独的模块,并且我们打算稍后在一个单独的过程中 运行 它,所以我为它使用了一个单独的 guice 注入器。 所以我有一个创建注入器的工厂方法和 returns 一个 class 实现功能接口(它有 3 个接口)
public class FeatureFactory {
private Injector injector;
public FeatureClass open() {
injector = createInjector();
return injector.getInstance(FeatureClass.class);
}
}
public class FeatureClass implements InterfaceA, InterfaceB, InterfaceC {
}
问题:
- 在这种情况下创建一个新的注入器是好的做法吗?我的意思是当整个功能驻留在一个单独的模块中时? 想法是将它们解耦,而不是将新功能 guice 模块作为功能的一部分 API.If 不是,更好的方法是什么?
- 返回功能 class 而不是接口的味道不太好。 它让用户了解实现 我该如何克服这个问题? 目前我使用应用程序 guice 模块将接口绑定到 FeatureClass
- 如何关闭该功能并收集所有 classes 垃圾? 正如我所说,打开该功能时,会创建一些单例和线程。 如果我将注入器字段设置为空,这是否意味着所有内容都会被垃圾收集?
创建多个注入器通常不是一个好主意。单例在一个注入器中的范围内,因此当您创建多个注入器时,您的单例不再是单例。
相反,创建一个允许调用者创建 class 实例的工厂 class,并向该工厂注入一个 Provider<FeatureClass>
@Singleton
public class FeatureClassFactory {
private final Provider<FeatureClass> provider;
private FeatureClass instance;
@Inject
FeatureClassFactory(Provider<FeatureClass> provider) {
this.provider = provider;
}
public synchronized FeatureClass get() {
if (instance == null) {
instance = provider.get();
}
return instance;
}
}
当然,您可以使用单例 Provider<FeatureClass>
作为 API 而不是创建工厂,但是 1) 我不喜欢在我的 public 中使用 Guice 接口APIs 和 2) 在生产模式下,初始化注入器时会创建单例,而你说你想延迟创建 FeatureClass
个实例。
至于返回实现与 class,哪个更好是一个有争议的问题,取决于用例和您的编码风格。
最后,由于单例在注入器范围内,注入器保持对所有单例的强引用。如果您需要在应用程序的生命周期内释放内存,则必须通过将字段设置为 null
and/or 清除集合来让 classes 释放内存。