Dagger 2 @Binds vs @Provides

Algus Dagger 2.12 (vabandust, ma tean, et see on juba mõnda aega tagasi, kuid tasub seda siiski mõista), on Daggersi lisatud see uus funktsioon nimega @Binds. Selle kohta on juba mõned ajaveebid. Nende lugemine paneb mind siiski mõtlema, mis eelist see meie vanadele truudele @Provides oma moodulites on.

Kuna minu eesmärk on teha asjad võimalikult selgeks, siis kirjutan seda pärast seda, kui olen selle kohta oma uurimise läbi viinud, viisil, mis mu küsimused selgeks saab.

Mille poolest erineb kodeerimine

@Provides

@Moodul
klass MyModule {
    @Provides
    lõbus getInjectClass (injectObject: InjectClass): InjectInterface {
        tagasi injectObject
    }
}
klass InjectClass @Inject konstruktor (): InjectInterface
liides InjectInterface

@Binds

@Moodul
abstraktne klass MyModule {
    @Binds
    abstraktne lõbus getInjectClass (injectObject: InjectClass):
        InjectInterface
}
klass InjectClass @Inject konstruktor (): InjectInterface
liides InjectInterface

Ülaltoodu põhjal pole @Bindsi ilmselget eelist @Providese ees. Üks sai omakorda abstraktseks klassiks ja funktsiooniks, teine ​​aga konkreetseks. See ei vähenda ükskõiksust (ega katteplaati).

Mis on @Bindsi eelis?

Selle teadmiseks vaatame mõnda ajalugu

Ajalooliselt…

Daggeri väga-väga-väga varases staadiumis pole sellist asja nagu @Module. @Moodulit ei ole tegelikult vaja, et Dagger 2 töötaks (vaadake maailma lühimat pistoda 2 koodi).

Kuid inimesed esitasid kaebusi ja soovisid seotud ülalpeetavaid grupeerida. Nii et Dagger 2 arendaja loobus ja lõi selle kuulsalt tuntud funktsioonikõne @Module, millel on eeliseid, nagu paljud soovivad.

Sellegipoolest toob @Module olemasolu koos @Provides'iga loodud koodis teatud üldkulusid. Nii tutvustati seda abistama @Binds.

Tõesta mulle seda ...

Ülaltoodud koodi kasutades (koos @komponendiga, mida ülaltoodud koodilõikes ei kuvata) ... vaatame üle erinevad

Lisamoodulite tehase klassid

Allpool on esitatud klassid.

Pange tähele, et @Provides genereerib klassi MyModule_GetInjectClassFactory, mida @Binds ei eksisteeri

Kuidas klass välja näeb? Vau, üsna vähe koode ...

Pealegi on see ainult ühe InjectClassi jaoks. Kuid kui meil on neid moodulis rohkem kui üks, genereerib igaüks neist ise tehase klassi

@Provides
lõbus getInjectClass (injectObject: InjectClass): InjectInterface {
    tagasi injectObject
}
@Provides
lõbus getInjectClass2 (injectObject2: InjectClass2): InjectInterface2 {
    tagasi injectObject2
}
@Provides
lõbus getInjectClass3 (injectObject3: InjectClass3): InjectInterface3 {
    tagasi injectObject3
}

Kujutage ette, kuidas see meie DexCountile ja rakenduse suurusele lisab !!

Moodul ümbrise lisakiht

Muud kui lisamooduliteguri klass, näeksime loodud DaggerMyComponenti klassi vaatamiseks koodi suurust erinevat.

Roosa on ainult @Provides'is, roheline on ainult @Binds

@Provides genereerib 52 koodirida ja @Binds genereerib ainult 29 koodirida (~ 40% vähendus !!).

Koodi jälgimisel näete voogu järgmiselt.

Vaadake, kui palju @Binds on InjectObjekti loomisel?

Lühidalt, mitte ainult @Binds ei vähenda ridade arvu, vaid vähendab ka objektide loomist ja operatsioonide voogu.

Nii et muutkem kõik @Bindsiks?

Kahjuks töötab @Binds ainult allpool toodud reeglite alusel

@Bindsi meetoditel peab olema ainult üks parameeter, mille tüüp on omistatav tagastamise tüübile

Nii et ainult üks parameeter ja tüüp return on tavaliselt antud parameetri objekti liides.

Sellegipoolest kaalutakse teiste näpunäidete puhul staatilise funktsiooni kasutamist @Provides jaoks, mis aitaks ka mõnda genereeritud koodi vähendada.

Lisateabe saamiseks lugege allpool oleva ajaveebi 1. osa jaotist (pärast ülaltoodud artiklite lugemist võite saada paremini aru allpool olevast ajaveebist)

Loodan, et see postitus on teile abiks. Minu muid huvitavaid teemasid võiksite vaadata siit.

Jälgige mind meediumites, Twitteris või Facebookis, et saada näpunäiteid ja õppida Androidi, Kotlini jms teemadel. ~ Elye ~