Middle
Kodėl turėtumėte naudoti @Binds anotaciją vietoj @Provides?
sobes.tech AI
Atsakymas iš AI
Pastaba @Binds naudojama nurodyti Dagger, kuri konkreti interfeiso įgyvendinimo versija turi būti teikiama, kai prašoma pačio interfeiso.
Šioje situacijoje @Binds naudojimo pranašumai prieš @Provides yra:
- Veikimas:
@Bindsyra efektyvesnis, nes Dagger generuoja mažiau kodo. Jis tiesiog sujungia interfeisą su konkrečiu tipu, nesukuriant naujo modulio pavyzdžio. - Skaitomumas: Kodas tampa aiškesnis, nes matyti, kuri klasė įgyvendina kurį interfeisą.
- Boilerplate kodo sumažinimas: Naudojant
@Binds, nereikia rašyti papildomo@Providesmetodo, kuris tiesiog grąžina įgyvendinimo pavyzdį.
Pavyzdys:
Vietoj:
@Module
class MyModule {
@Provides
fun provideMyInterface(implementation: MyInterfaceImpl): MyInterface {
return implementation;
}
}
interface MyInterface {
// ...
}
class MyInterfaceImpl : MyInterface {
// ...
}
Geriausia naudoti:
@Module
abstract class MyModule { // Modulis turi būti abstraktus
@Binds
abstract fun bindMyInterface(implementation: MyInterfaceImpl): MyInterface; // Metodas turi būti abstraktus
}
interface MyInterface {
// ...
}
class MyInterfaceImpl : MyInterface {
// ...
}
@Provides žymuo lieka būtinas, kad būtų galima tiekti objektus, kurie nėra interfeisų įgyvendinimai arba reikalauja sudėtingesnės instancijavimo logikos (pvz., objektų kūrimas naudojant builderius, objektų teikimas iš išorinių bibliotekų, priklausomybių teikimas, kurių negalima injektuoti per konstruktorių).