Android 匕首2两个职业都扮演单身汉,科特林

Android 匕首2两个职业都扮演单身汉,科特林,android,kotlin,singleton,dagger-2,Android,Kotlin,Singleton,Dagger 2,我是《匕首2》的新手,正在练习单打,但我面临困惑,我不明白为什么会发生这种情况。 这是非常直接的逻辑: 两个班!人与人。人类是单态的,人类是简单的类,只是@inject构造函数。 当我将Human类设置为singleton并在Human类参数的@inject构造函数中使用people时,尝试打印一些日志消息,并在主活动中@inject Human类并调用Human类函数。它将两个类都显示为一个单独的类。下面是一些代码。 人类阶级 @Singleton class Human @Inject co

我是《匕首2》的新手,正在练习单打,但我面临困惑,我不明白为什么会发生这种情况。
这是非常直接的逻辑:
两个班!人与人。人类是单态的,人类是简单的类,只是@inject构造函数。 当我将Human类设置为singleton并在Human类参数的@inject构造函数中使用people时,尝试打印一些日志消息,并在主活动中@inject Human类并调用Human类函数。它将两个类都显示为一个单独的类。下面是一些代码。

人类阶级

@Singleton
class Human @Inject constructor(
    private var people: People
){
    fun human(){
        Log.d(Tag,"Human-> $this || People-> $people ")
    } 
}
主要活动

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()
    }
}
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:05:01.064 5831-5831/com.example.daggerinjection D/Human: Human-> com.example.daggerinjection.human.Human@49111bd || People-> com.example.daggerinjection.human.People@a5a53b2 
看到了吗?我用不同的实例调用了Human类,但Human和people都作为单例,但实际上people类在第二次输出中应该是不同的。
但当我这么做的时候

人类阶级

@Singleton
class Human @Inject constructor()
主要活动

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()
    }
}
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

为什么会这样?

人类是单身汉。一旦创建了一个实例,Dagger就不会再创建另一个实例。因此
human2
human1
相同。由于Dagger不会创建另一个实例,
people
变量将是相同的


如果在生成的代码中检查
DaggerAppComponent
文件,您将看到
Human
的空检查,并且仅当它为空时才创建实例。

Singleton意味着您将只有该类的一个实例。如果你有一个
,当你向Dagger索要时,你总会得到同样的
,内容也一样。例如,你不能让一个人有两张不同的脸。因此,在您的案例中,
human1
human2
是相同的
Human
您刚刚更改了变量名称,但对于第一个变量,它仍然是相同的
Human

,输出是正确的。由于
Human
类是一个单例类,因此只能实例化一次。一旦
人员
被分配给它,为什么它会改变,除非你手动改变它。所以在这种情况下,Dagger永远不会为human2创建另一个
Human
实例。它只会给你已经存在的一个。好吧,但如果我说我想让人成为应用程序级别和活动级别的人/脸,你会怎么做?因为当我在活动范围中将人作为应用程序级别和面/人时,它会给我错误,或者
不能使用不同的
范围,因为人类使用人/面类作为其构造函数参数。。。但是我必须将person类设置为应用程序级,将human类设置为活动级,才能使其正常工作。如果在应用程序级创建一个“HumanManager”,你会要求“HumanManager”设置为“createNewHuman(new Hair(),new Face()”,这样会为你返回一个新的人,并带有新头发和新面孔?通过这种方式,您可以创建任意数量的新用户,并且您将拥有一个全球经理,可以在应用程序中的任何位置创建新用户。如果您愿意,您还可以在管理器中的列表中保存您创建的人员,以便您可以访问从不同位置创建的人员。我们可以将任何类设置为单例?还是有一些限制?正如我在@Rafael的回答中所描述的:
好吧,但如果我说我想让人成为应用程序级别,让人/脸成为活动级别,你会怎么做?因为当我在活动范围中将人作为应用程序级别和面/人时,它会给我错误,或者不能使用不同的范围,因为人类使用人/面类作为其构造函数参数。。。但我必须将person类设置为应用程序级,将human类设置为活动级,才能使其正常工作
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