我是 dagger2 的新手,正在练习单身人士,但我面临混乱,我不明白为什么会这样。
这是很直接的逻辑:
两节课!人与人。人是单人,人是简单的类,只是 @inject构造子。
当我使人类类单身并在人类类参数的@inject构造函数中使用人并尝试打印一些日志消息并在主要活动中@Inject人类类并调用人类类函数时。它把两个类都显示为一个单例。这是一些代码。
人类阶级
@Singleton
class Human @Inject constructor(
private var people: People
){
fun human(){
Log.d(Tag,"Human-> $this || People-> $people ")
}
}
//People Class
class People @Inject constructor()
//Component Interface
@Singleton
@Component
interface AppComponent {
fun inject(mainActivity: MainActivity)
}
主要活动
class MainActivity : AppCompatActivity() {
@Inject
lateinit var human: Human
@Inject
lateinit var humanTwo: Human
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val component = DaggerAppComponent.create()
component.inject(this)
human.human()
humanTwo.human()
}
}
这是输出
2019-12-05 20:05:01.064 5831-5831/com.example.daggerinjection D/Human: Human-> com.example.daggerinjection.human.Human@49111bd || People-> com.example.daggerinjection.human.People@a5a53b2
2019-12-05 20:05:01.064 5831-5831/com.example.daggerinjection D/Human: Human-> com.example.daggerinjection.human.Human@49111bd || People-> com.example.daggerinjection.human.People@a5a53b2
看到了吗?我称人类类具有不同的实例,但人类和人都充当单身人士,但实际上,人类类在第二个输出中应该是不同的。
但是当我这样做时。
人类阶级
@Singleton
class Human @Inject constructor()
//People Class
class People @Inject constructor(
private var human: Human
) {
fun person() {
Log.d(Tag,"People -> $this || Human-> $human")
}
}
//Interface is same as above nothing changed
主要活动
class MainActivity : AppCompatActivity() {
@Inject
lateinit var people: People
@Inject
lateinit var peopleTwo: People
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val component = DaggerAppComponent.create()
component.inject(this)
people.person()
peopleTwo.person()
}
}
输出应为:
2019-12-05 20:11:53.292 6107-6107/com.example.daggerinjection D/Human: People -> com.example.daggerinjection.human.People@49111bd || Human-> com.example.daggerinjection.human.Human@a5a53b2
2019-12-05 20:11:53.293 6107-6107/com.example.daggerinjection D/Human: People -> com.example.daggerinjection.human.People@ba20f03 || Human-> com.example.daggerinjection.human.Human@a5a53b2
为什么会这样?
答案 0 :(得分:0)
Human
是一个单例。创建实例后,Dagger将不会创建另一个实例。因此human2
与human1
相同。由于Dagger不创建其他实例,因此people
变量将相同。
如果您在生成的代码中检查DaggerAppComponent
文件,则将看到Human
的空检查,并且仅在该实例为空时创建一个实例。
答案 1 :(得分:0)
Singleton意味着您将只有一个此类的实例。如果您只有一个Human
,则在向Dagger索取时,您将始终获得具有相同内容的相同Human
。例如,您不能只有一个Human
,而让他有两个不同的Faces
。因此,在您的情况下,human1
和human2
是相同的Human
,您只是更改了变量名称,但仍然是相同的Human
。