Sobes.tech
Middle

Zašto treba koristiti anotaciju @Binds umesto @Provides?

sobes.tech АИ

Одговор од АИ

Napomena @Binds se koristi za označavanje Daggeru koje konkretno implementaciju interfejsa treba da obezbedi kada se traži sama interfejs.

Prednosti korišćenja @Binds umesto @Provides u ovom slučaju su:

  • Performanse: @Binds je efikasniji jer Dagger generiše manje koda. Jednostavno povezuje interfejs sa konkretnim tipom bez kreiranja novog primera modula.
  • Čitljivost: Kod postaje jasniji jer je vidljivo koja klasa implementira koji interfejs.
  • Smanjenje boilerplate koda: Kada koristite @Binds, nije potrebno da pišete dodatnu metodu sa @Provides koja samo vraća instancu implementacije.

Primer:

Umesto:

@Module
class MyModule {

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

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

Bolje je koristiti:

@Module
abstract class MyModule { // Modul mora biti apstraktan

    @Binds
    abstract fun bindMyInterface(implementation: MyInterfaceImpl): MyInterface; // Metod mora biti apstraktan

}

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

Napomena @Provides ostaje neophodna za obezbeđivanje objekata koji nisu implementacije interfejsa ili zahtevaju složeniju logiku instanciranja (npr. kreiranje objekata putem buildera, obezbeđivanje objekata iz eksternih biblioteka, obezbeđivanje zavisnosti koje ne mogu biti injektovane putem konstruktora).