gpt4 book ai didi

java - 如何正确创建和关闭功能

转载 作者:行者123 更新时间:2023-11-30 07:17:12 25 4
gpt4 key购买 nike

我正在开发一项可由用户启用和禁用的功能。它在一个单独的模块中实现,并创建一些线程和一些单例。因为我有一个单独的模块,并且我们打算稍后在单独的进程中运行它,所以我为它使用了一个单独的 guice 注入(inject)器。所以我有一个工厂方法来创建注入(inject)器并返回一个实现功能接口(interface)的类(它有 3 个接口(interface))

public class FeatureFactory {
private Injector injector;
public FeatureClass open() {
injector = createInjector();
return injector.getInstance(FeatureClass.class);
}
}

public class FeatureClass implements InterfaceA, InterfaceB, InterfaceC {

}

问题:

  1. 在这种情况下创建一个新的注入(inject)器是好的做法吗?我的意思是当整个功能驻留在单独的模块中时?我们的想法是将它们解耦,并且不将新功能 guice 模块作为功能 API 的一部分。如果没有,什么是更好的方法?
  2. 返回要素类而不是接口(interface)的味道不太好。它让用户了解实现情况我该如何克服这个问题?目前,我使用应用程序 guice 模块将接口(interface)绑定(bind)到要素类
  3. 如何关闭该功能并收集所有类的垃圾?正如我所说,当打开该功能时,会创建一些单例和线程。如果我将注入(inject)器字段设置为空,是否意味着所有内容都会被垃圾收集?

最佳答案

创建多个注入(inject)器通常是一个坏主意。单例的作用域位于一个注入(inject)器中,因此当您创建多个注入(inject)器时,您的单例不再是单例。

相反,创建一个工厂类,允许调用者创建该类的实例,并向该工厂注入(inject) 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) API 中使用 Guice 接口(interface),2) 在生产模式下,单例是在注入(inject)器时创建的已初始化,并且您说要延迟创建 FeatureClass 实例。

至于返回实现与类,哪个更好是一个有争议的问题,并且取决于用例和您的编码风格。

最后,由于单例的作用域与注入(inject)器有关,因此注入(inject)器保留对所有单例的强引用。如果您需要在应用程序的生命周期内释放内存,则必须通过将字段设置为 null 和/或清除集合来让您的类释放内存。

关于java - 如何正确创建和关闭功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38181406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com