Middle
Dlaczego należy używać adnotacji @Binds zamiast @Provides?
sobes.tech AI
Odpowiedź od AI
Adnotacja @Binds jest używana do wskazania Daggerowi, którą konkretną implementację interfejsu powinien dostarczyć, gdy żądana jest sama interfejs.
Zalety korzystania z @Binds zamiast @Provides w tym przypadku to:
- Wydajność:
@Bindsjest bardziej wydajne, ponieważ Dagger generuje mniej kodu. Po prostu łączy interfejs z konkretnym typem bez tworzenia nowej instancji modułu. - Czytelność: Kod staje się bardziej czytelny, ponieważ wyraźnie widać, która klasa implementuje który interfejs.
- Redukcja boilerplate: Przy użyciu
@Bindsnie trzeba pisać dodatkowej metody@Provides, która po prostu zwraca instancję implementacji.
Przykład:
Zamiast:
@Module
class MyModule {
@Provides
fun provideMyInterface(implementation: MyInterfaceImpl): MyInterface {
return implementation;
}
}
interface MyInterface {
// ...
}
class MyInterfaceImpl : MyInterface {
// ...
}
Lepiej używać:
@Module
abstract class MyModule { // Moduł musi być abstrakcyjny
@Binds
abstract fun bindMyInterface(implementation: MyInterfaceImpl): MyInterface; // Metoda musi być abstrakcyjna
}
interface MyInterface {
// ...
}
class MyInterfaceImpl : MyInterface {
// ...
}
Adnotacja @Provides nadal jest potrzebna do dostarczania obiektów, które nie są implementacjami interfejsów lub wymagają bardziej skomplikowanej logiki tworzenia instancji (np. tworzenie obiektów przez buildery, dostarczanie obiektów z bibliotek zewnętrznych, dostarczanie zależności, których nie można wstrzyknąć przez konstruktor).