Sobes.tech
Middle

Perché dovremmo usare l'annotazione @Binds invece di @Provides?

sobes.tech AI

Risposta dell'AI

L'annotazione @Binds viene utilizzata per indicare a Dagger quale implementazione specifica di un'interfaccia deve fornire quando viene richiesta l'interfaccia stessa.

I vantaggi di usare @Binds invece di @Provides in questo caso sono:

  • Prestazioni: @Binds è più efficiente, poiché Dagger genera meno codice. Collega semplicemente l'interfaccia a un tipo concreto senza creare una nuova istanza del modulo.
  • Leggibilità: Il codice diventa più chiaro, poiché è evidente quale classe implementa quale interfaccia.
  • Riduzione del boilerplate: Usando @Binds, non è necessario scrivere un metodo aggiuntivo con @Provides che restituisce semplicemente un'istanza dell'implementazione.

Esempio:

Invece di:

@Module
class MyModule {

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

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

È meglio usare:

@Module
abstract class MyModule { // Il modulo deve essere astratto

    @Binds
    abstract fun bindMyInterface(implementation: MyInterfaceImpl): MyInterface; // Il metodo deve essere astratto

}

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

L'annotazione @Provides rimane necessaria per fornire oggetti che non sono implementazioni di interfacce o che richiedono una logica di istanziazione più complessa (ad esempio, creare oggetti tramite builder, fornire oggetti da librerie esterne, fornire dipendenze che non possono essere iniettate tramite il costruttore).