将@Provides方法绑定为急切单例

Jor*_*orn 11 java guice

我想使用注释@Provides为热切单例的方法进行绑定.我发现了错误216,这表明这是不可能的,但没有@Provides明确提到注释.

我目前有一个课程要求eager单身人士及时成为单身人士,但这不是一个非常好的解决方案.

public class LogicModule extends AbstractModule {
    @Override public void configure() {
        bind(SomeDep.class);
        bind(MyWorkaround.class).asEagerSingleton();
    }

    // cannot add eager requirement here
    @Provides @Singleton Logic createLogic(SomeDep dep) {
        return LogicCreator.create(dep);
    }

    private static class MyWorkaround {
        @Inject Logic logic;
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以更改评论附近会使变通方法类过时的内容吗?

Mil*_*ran 12

为什么不使用

bind(Logic.class).toInstance(LogicCreator.create(dep)); 
//ohh we missing dep
Run Code Online (Sandbox Code Playgroud)

然后我们可以做到这一点

class LogicProvider implements Provider<Logic> {

    private final SomeDep dep;

    @Inject
    public LogicProvider(SomeDep dep) {
      this.dep = dep;
    }

    @Override
    public Logic get() {
      return LogicCreator.create(dep);
    }

}
Run Code Online (Sandbox Code Playgroud)

然后

bind(Logic.class).toProvider(LogicProvider.class).asEagerSingleton();
Run Code Online (Sandbox Code Playgroud)

你甚至可以通过SomeDep dep你的提供者Provider<SomeDep>,然后调用providerDep.get()LogicCreator.create(),这将是更稳健一点.