Sobes.tech
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: @Binds yra 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 @Provides metodo, 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ų).