Dagger 2 @Binds vs @Provides

Alkaen Dagger 2.12 (anteeksi, tiedän sen jo kauan sitten .. mutta silti syytä ymmärtää sitä), Daggersiin on lisätty tämä uusi ominaisuus nimeltä @Binds. Tästä on jo joitain blogeja. Niiden lukeminen saa minut kuitenkin ihmettelemään, mitä hyötyä sillä on vanhalle uskolliselle @Providesille, joka meillä on moduuleissamme.

Koska tavoitteeni on tehdä asiat mahdollisimman selkeiksi, kirjoitan tämän tutkittuaani asiaa tavalla, joka tyhjentää kysymykseni.

Mikä on erilainen koodauksessa?

@Tarjoaa

@Moduuli
luokka MyModule {
    @Tarjoaa
    hauska getInjectClass (injectObject: InjectClass): InjectInterface {
        palauta injectObject
    }
}
luokka InjectClass @Inject konstruktori (): InjectInterface
käyttöliittymä InjectInterface

@Binds

@Moduuli
abstrakti luokka MyModule {
    @Binds
    abstrakti hauska getInjectClass (injectObject: InjectClass):
        InjectInterface
}
luokka InjectClass @Inject konstruktori (): InjectInterface
käyttöliittymä InjectInterface

Yllä olevan perusteella @Bindsillä ei ole selvää selvää etua verrattuna @Providesiin. Toisesta tuli abstrakti luokka ja funktio, kun taas toinen on konkreettinen. Se ei vähennä minkäänlaista monimuotoisuutta (tai kattilalevyä).

Joten mikä @Bindsin etu on?

Tietääkö tämä, katsotaanpa historiaa

Historiallisesti ...

Daggerin erittäin-hyvin varhaisessa vaiheessa ei ole sellaista asiaa kuin @Module. @Moduulia ei itse asiassa tarvita, jotta Dagger 2 voi toimia (tarkista maailman lyhyin tikari 2 -koodi).

Ihmiset kuitenkin valittivat ja halusivat ryhmitellä sukulaisista riippuvaisia. Joten Dagger 2 -kehittäjä luopui ja loi tämän kuuluisan ominaisuuspuhelun @Module, jolla on sen etuja, kuten monet haluavat.

Siitä huolimatta, että @Module on olemassa @Provides-sovelluksen kanssa, se tuo jonkin verran yleiskuvaa generoituun koodiin. Joten @Binds otettiin käyttöön auttamaan sitä.

Todista se minulle…

Käyttämällä yllä olevaa koodia (yhdessä @Componentin kanssa, jota ei näytetä yllä olevassa koodinpätkässä) ... katsotaanpa eri

Lisämoduulitehdasluokat

Alla on luodut luokat.

Huomaa, että @Provides luo MyModule_GetInjectClassFactory-luokan, jota ei ole @Binds-sivustossa

Miltä luokka näyttää? Vau, melko vähän koodeja ..

Lisäksi tämä on vain yhdelle InjectClassille. Mutta jos moduulissamme on enemmän kuin yksi niistä, jokainen tuottaa itse tehdasluokan

@Tarjoaa
hauska getInjectClass (injectObject: InjectClass): InjectInterface {
    palauta injectObject
}
@Tarjoaa
hauska getInjectClass2 (injectObject2: InjectClass2): InjectInterface2 {
    palauta injectObject2
}
@Tarjoaa
hauska getInjectClass3 (injectObject3: InjectClass3): InjectInterface3 {
    palauta injectObject3
}

Kuvittele, kuinka tämä lisää DexCount- ja sovelluskokoamme !!

Ylimääräinen kerros moduulin käärettä

Muu kuin ylimääräinen moduulikerroinluokka, jos tarkastelemme luodua DaggerMyComponent-luokkaa, näemme koodin koon eri.

Vaaleanpunainen on vain @Provides-julkaisussa, kun taas vihreä on vain @Binds-aiheinen

@Provides generoi 52 koodiriviä, ja @Binds tuottaa vain 29 koodiriviä (~ 40%: n alennus !!).

Jos jäljität koodia, näet virran alla esitetyllä tavalla.

Katso kuinka paljon ytimekästä @Binds on InjectObjectin luomisessa?

Lyhyesti sanottuna, paitsi @Binds vähentää rivien määrää, se myös vähentää objektin luomista ja toiminnan virtausta.

Joten muutettakoon kaikki tilaksi @Binds?

Valitettavasti @Binds toimii vain alla olevien sääntöjen perusteella

@Binds-menetelmillä on oltava vain yksi parametri, jonka tyyppi voidaan määrittää paluutyypille

Joten vain yksi parametri, ja tyypin paluu on tyypillisesti annetun parametriobjektin rajapinta.

Tämän jälkeen muissa vinkissä harkitaan staattisen toiminnon käyttöä @Provides-sovelluksessa, mikä auttaisi myös vähentämään joitain generoituja koodeja.

Tutustu alla olevan blogin 1. osan osioon saadaksesi lisää tietoa (kun olet lukenut yllä olevan, saatat saada paremman käsityksen alla olevasta blogista)

Toivon, että tämä viesti on hyödyllinen sinulle. Voit tutustua muihin mielenkiintoisiin aiheisiin täällä.

Seuraa minua mediassa, Twitterissä tai Facebookissa saadaksesi pieniä vinkkejä ja oppimista Androidiin, Kotliniin jne. Liittyvistä aiheista. ~ Elye ~