Sobes.tech
Middle

De ce ar trebui să folosiți adnotarea @Binds în loc de @Provides?

sobes.tech AI

Răspuns de la AI

A adnotare @Binds este utilizată pentru a indica lui Dagger ce implementare specifică a unei interfețe trebuie furnizată atunci când se solicită chiar interfața.

Avantajele utilizării @Binds în loc de @Provides în acest caz sunt:

  • Performanță: @Binds este mai eficient, deoarece Dagger generează mai puțin cod. Leagă pur și simplu interfața de un tip concret fără a crea o nouă instanță a modulului.
  • Citibilitate: Codul devine mai clar, deoarece este clar ce clasă implementează ce interfață.
  • Reducerea boilerplate-ului: Folosind @Binds, nu este necesar să scrii o metodă suplimentară cu @Provides care doar returnează o instanță a implementării.

Exemplu:

În loc de:

@Module
class MyModule {

    @Provides
    fun provideMyInterface(implementation: MyInterfaceImpl): MyInterface {
        return implementation;
    }
}

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

Este mai bine să folosești:

@Module
abstract class MyModule { // Modulul trebuie să fie abstract

    @Binds
    abstract fun bindMyInterface(implementation: MyInterfaceImpl): MyInterface; // Metoda trebuie să fie abstractă

}

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

Adnotarea @Provides rămâne necesară pentru furnizarea obiectelor care nu sunt implementări ale interfețelor sau care necesită o logică mai complexă de instanțiere (de exemplu, crearea de obiecte prin intermediul builder-ilor, furnizarea de obiecte din biblioteci externe, furnizarea de dependențe care nu pot fi injectate prin constructor).