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:
@Bindsje 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í
@Bindsnení 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).