- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这是关于如何存储生命周期应等于应用程序生命周期的@Singleton 作用域 Dagger 2 组件的第 N 个问题。
在使用 Dagger 2 的 Android 应用程序中,通常至少有一个 Component 是 @Singleton 范围的,并且应该在应用程序的整个生命周期中持续存在:由于这些要求,它通常被初始化并存储在自定义 Application 类中。
因为这个组件的实例必须在我们应用程序的所有部分都可以访问,所以我见过这样的代码:
public class App extends Application {
public static AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this)).build();
}
}
这样就可以在其他任何地方访问:
App.appComponent.inject(this);
public class App extends Application {
private static AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this)).build();
}
public static AppComponent getAppComponent() {
return appComponent;
}
}
这样就可以在其他任何地方访问:
App.getAppComponent().inject(this);
public class App extends Application {
private AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this)).build();
}
public AppComponent getAppComponent() {
return appComponent;
}
}
这样它只能从持有对 Context 的引用的类实例访问:
// From within an Activity.
((App) getApplication()).getAppComponent().inject(this);
// From within a Fragment.
((App) getActivity().getApplication()).getAppComponent().inject(this);
// From within any other class which holds a reference to a Context.
((App) context.getApplicationContext()).getAppComponent().inject(this);
最后一种方式使得将 Context 引用传递给任何愿意访问组件的类变得非常强制(即使该类出于任何其他目的不需要该 Context)。
恕我直言,必须“手动注入(inject)”一个 Context 实例才能访问注入(inject)器本身,这听起来有点违反直觉。
另一方面,许多人建议不要使用静态变量,但是:为什么?如果一个对象必须在应用程序的生命周期(这意味着 JVM 实例的整个生命周期)内保留在内存中,如果它存储在静态变量中会有什么问题?
其他人说静态的东西不能在测试中被模拟,这是真的,虽然我不确定我完全理解这个,因为它是 DI 模式,而不是注入(inject)器本身,它可以轻松模拟/测试,所以为什么会我们想模拟注入(inject)器本身吗?
这些替代方案的优缺点是什么?除了这里已经提到的之外,还有其他可能的替代方案吗?
最佳答案
对于 1 和 2,您使用的是静态引用。这是一个关于为什么要避免它们的好帖子
Why are static variables considered evil?
所以剩下的唯一选择就是第三个。这就是我在我的项目中使用的。关于是否应该将上下文作为参数传递,取决于项目的体系结构以及设计 Dagger 依赖项的方式。我个人没有这个问题,因为我只注入(inject) Activity/fragment 。你能给我一个例子,你需要传递上下文来注入(inject)依赖吗?
关于java - Android 上的 Dagger 2。存储和访问 @Singleton 组件的不同方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39264599/
是否有一个意思是“不是单例”的名字? 最佳答案 CaSTLe Windsor 使用术语“ transient ”来描述所有非单例对象。 不过,我个人更喜欢“非单例”一词。 关于singleton -
我有很多(抽象)工厂,它们通常被实现为单例。 通常是为了方便,不必让他们通过那些真正与使用或了解这些工厂无关的层。 大多数时候我只需要在启动时决定其余代码程序的工厂实现,也许通过一些配置 它看起来例如
我有几个关卡都使用相同的音效。我没有在每个级别都使用相同的代码,而是将所有声音合并到一个单例类中。但是,当我从其他类运行该方法时,将其置于单例中不会播放任何声音。我没有错误或警告。 当我在每个类中使用
我应该使用 EJB-@Singleton (javax.ejb.Singleton) 进行统计或监控,还是将统计信息缓存在公共(public) @SessionScoped-Bean 中会更好?为了澄
我有这个单例类: public class Utente { private static readonly Lazy lazy = new Lazy(() => new Utente
我的 iOS 应用程序对 Web 服务做了很多不同的请求。每个请求都是对 ConnectionManager 对象的方法的调用。当响应从 Web 服务到达时,将调用委托(delegate)的方法来通知
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: cracking singleton with other ways 任何人都可以告诉我 Singleton不能用作
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: cracking singleton with other ways 任何人都可以告诉我 Singleton不能用作
做用 @Singleton 注释的类必须遵循 Singleton design pattern ? 我的猜测是他们没有:没有必要有私有(private)构造函数和 static .instance()
我想提供 Java 中可用的内置单例类列表以及使它们成为单例的原因。 对于 E.G. java.lang.Runtime 原因:因为整个 Java 应用程序只能有一个运行时环境。 java.awt.T
我有一个 Python 3 类,它目前是使用 @singleton 装饰器定义的单例,但有时它需要不是是单例。 问题:是否可以在实例化类的对象时传递一个参数,由该参数决定该类是单例还是非单例? 我正试
我正在使用 get_it 包,你有两个选项来注册单例,懒惰和我猜是“常规”(分别是 GetIt.instance.registerLazySingleton 和 GetIt.instance.regi
单例模式在 Spring 容器级别维护实例,而单例设计模式在类加载器级别维护实例。 还有其他区别吗? 其次,我仍然认为上述理由不成立。事实上,一个应用程序上下文/容器仅加载在一个类加载器中。因此从技术
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
在 Guice 中,有什么区别: // Inside your AbstractModule subclass: @Override public void configure() { bin
我使用 pthread TLS 实现了一种“线程本地单例”,我想知道在这种情况下我如何(以及何时)可以删除 pthread_key_t,因为就像现在一样,TLS key 使用的内存永远不会空闲' d。
如何从 @Singleton 组件返回非单例对象? 例如我有: ApplicationComponent.kt @Singleton @Component(modules = [Application
我正在学习 Dagger 2,我注意到在某些示例中,模块方法中有一个 @Singleton,而组件方法中有其他 @Singleton?模块方法和组件方法上的 @Singleton 批注有什么区别,究竟
我的代码中需要一个单例。我读了 Jon Skeet 的 page在单例上并根据他的推荐选择了这个模型(#4): public sealed class Singleton { private
我正在尝试使用 label2rgb 生成 RGB 标签切片并使用它来更新 RGB 体积,如下所示: labelRGB_slice=label2rgb(handles.label(:,:,han
我是一名优秀的程序员,十分优秀!