Sobes.tech
Middle

Proč byste měli používat anotaci @Binds místo @Provides?

sobes.tech AI

Odpověď od AI

Poznámka @Binds se používá k označení toho, jakou konkrétní implementaci rozhraní má Dagger poskytnout, když je požadováno samotné rozhraní.

Výhody použití @Binds místo @Provides v tomto případě jsou:

  • Výkon: @Binds je efektivnější, protože Dagger generuje méně kódu. Jednoduše propojuje rozhraní s konkrétním typem bez vytváření nového instance modulu.
  • Čitelnost: Kód je přehlednější, protože je jasně vidět, která třída implementuje jaké rozhraní.
  • Zkrácení boilerplate kódu: Při použití @Binds není nutné psát další metodu s @Provides, která pouze vrací instanci implementace.

Příklad:

Namísto:

@Module
class MyModule {

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

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

Je lepší použít:

@Module
abstract class MyModule { // Modul musí být abstraktní

    @Binds
    abstract fun bindMyInterface(implementation: MyInterfaceImpl): MyInterface; // Metoda musí být abstraktní

}

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

Poznámka @Provides zůstává nezbytná pro poskytování objektů, které nejsou implementacemi rozhraní nebo vyžadují složitější logiku instanciace (například vytváření objektů přes buildery, poskytování objektů z externích knihoven, poskytování závislostí, které nelze injektovat přes konstruktor).