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ță:
@Bindseste 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@Providescare 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).