gpt4 book ai didi

java - 在 Dagger 中实现单例构建器

转载 作者:行者123 更新时间:2023-12-02 09:16:12 25 4
gpt4 key购买 nike

我有一个类,我想通过 Dagger 注入(inject)。它需要一个构建器,因为它的一些参数只有在运行时才知道。我也希望这个类是一个单例。

也就是说,我们的代码库中有几个部分需要该类的实例,但实际上只有代码库的一部分知道如何设置它。

设置发生在应用程序的早期 - 在任何人真正尝试使用单例之前 - 但在 Dagger 已经初始化其根组件之后。

代码的其他部分访问该对象的正确方法是什么?

class S {
private S(Foobar foobar) {
// ...
}

@Singleton
public static class Builder {
Foobar foobar;
@Inject
public Builder() {}

public Builder setFoobar(Foobar foobar) {
this.foobar = foobar;
}

public S build() {
return new S(foobar);
}
}
}

class Main {
private Foobar foobar = new Foobar();
private final S s;

@Inject
public Main(S.Builder sBuilder) {
s = sBuilder.setFoobar(foobar).build();
}
}

class Other {
private final S s;

@Inject
public Other(/* What do I put here to get access to S? */) {
}

编辑:为了清楚起见,让我声明一下,此示例中的 Foobar 是在应用程序的早期创建的,但在 Dagger 和应用程序的高级结构实例化之后创建。这个特定的程序是一个Android应用程序;在本例中,Foobar 是一个膨胀的 View ,S 是该 View 的 Controller 。

只会有一个 Foobar 和一个 S。我们代码的各个部分都希望能够与 S 进行通信,但实际上只有代码的一部分可以创建它。

最佳答案

您可以使用 BindsInstance https://dagger.dev/api/2.10/dagger/BindsInstance.html

您的应用程序创建RootComponent。在创建过程中,它应该提供 Foobar 的实例。我们看一下伪代码

class S {
private S(Foobar foobar) {
// ...
}

public static class Builder {
Foobar foobar;

public Builder() {}

public Builder setFoobar(Foobar foobar) {
this.foobar = foobar;
}

public S build() {
return new S(foobar);
}
}
}

@Module
public static class RootModule {

@Provides
@Singleton
public static S provideS(Foobar foobar) {
return new S.Builder().setFoobar(foobar).build();
}
}

@Singleton
@Component(module = {RootModule.class})
public interface RootComponent {
@Component.Factory
interface Factory {
public RootComponent create(@BindsInstance Foobar foobar)
}
}

public class Application {
private RootComponent createComponent() {
return DaggerRootComponent.factory().create(new Foobar())
}
}

更新

This specific program is an Android app; the Foobar in this case a View that is inflated, and S a controller for that View.

我强烈建议您不要保留对View的引用。这可能会产生微妙的错误和内存泄漏。相反,我建议您引入某种事件总线,它将成为 Dagger 图中的单例,并在 S ( View Controller )和消费者之间共享。该偶数总线将用于消费者和 S( View Controller )之间的通信。

关于java - 在 Dagger 中实现单例构建器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58964669/

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