当前位置: 首页 > 知识库问答 >
问题:

匕首:如何检查匕首。惰性变量已初始化

姜志
2023-03-14

我找到了静态编程语言Lazy对象的答案,在这里使用isLaunalize():静态编程语言:检查Lazy val是否已初始化

但看起来像匕首。Lazy没有相同的公共方法。

这就是我如何懒洋洋地使用Dagger注射:

@Inject internal lateinit var someService: dagger.Lazy<SomeService>

如何在不调用someService的情况下检查someService是否已初始化。get()哪个将初始化它?除了引入布尔标志并自己跟踪它之外。。

谢谢

共有1个答案

有玄天
2023-03-14

没有办法检查;Lazy只有一个方法,get,使其成为一个功能接口或“单一抽象方法(SAM)”接口,非常类似于JSR330的提供商、Guava的供应商和JDK8供应商。

这个抽象很重要,因为在Dagger中Lazy的定义更复杂,并且有不止一个实现。对于作用域绑定,内部InstanceFactory本身实现了Lazy,因此内置的Provider

此外,Kotlin的Lazy有多种同步模式可供选择,其中一些在并发调用时会有未定义的行为。< code>isInitialized在任何一种模式下都不会同步,因此在并发环境中,当值处于构造中期时,您可能会收到< code>false,或者它甚至可能是在不同的线程上完全构造的,而该值只是从调用< code>isInitialized的线程中尚不可见。

如果您需要能够检查类似懒惰的状态,您将需要指定您对构造的关注程度以及您希望结果的线程安全性,这是足够定制的,以保证您自己的实现。

 类似资料:
  • Dagger 2即将面世,但可用的示例甚至无法立即编译,文档是Dagger 1的复制粘贴替换。 有没有人有一个在谷歌的Dagger 2上运行的正确应用程序的例子?

  • 这很好,但是如果我使用全局组件甚至子组件中的一个模块,那么应该传入上下文。因此,这意味着如果我用匕首注入演示器,它将被绑定到ApplicationContext。这使得作为JUnit进行测试变得困难。Android代码不应该在演示器中。 所以我想问的是,最好的做法是只在活动、片段、广播接收器和服务中使用匕首吗?就mvp架构而言,这就是。另一个解决方案是设计另一个dagger组件,但不是与appco

  • 问题内容: 我可能错过了一些东西,但我认为像@Singleton这样的作用域用于定义“作用域生命周期”。 我在Android应用程序中使用了Dagger 2(但我认为问题根本与android相关)。 我有1个模块: 我有两个与范围不同的组件: 两者,并且,有一个构造函数。虽然MenuPresenter期望将其作为参数,但LoginPresenter却采用了: 但是每次我使用这些组件创建一个或时,都

  • 我在android项目中使用Dagger2我有两个作用域:ActivityScope和FragmentScope我读了一些示例代码,他们说定义并使用ActivityScope,所以对象将在activity lifecycle中销毁。因为活动和片段有不同的生命周期,所以我们应该有两个作用域。 我的问题是:我是否需要做一些事情让代码知道,当我使用ActivityScope时,对象应该随活动生命周期一起

  • 我正在使用Dagger 2,在为我的类实现测试时,模块中的generate singleton providers存在一些问题。 所以我有两个问题。 > 我不能使用构造函数注入,因为有一个默认的构造函数。如何从测试模块中获取Foo? 在和中,如何确保在运行每个测试时创建的新实例? 谢谢

  • 我有一个库项目/模块,Android应用程序和普通java应用程序都使用它。在Dagger 1中,此项目/模块具有属性。其中有一个@Inject字段,任何类实现或@Provides方法都不能满足该字段。其想法是强制具有的“顶部”模块提供特定于系统的实现 举个例子:在library项目中,我有一个ActLogin活动,它有字段。此字段的值在登录到服务器时使用。ActLogin由使用此库的多个应用程序