Sobes.tech
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ść: @Binds jest 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 @Binds nie 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).