Sobes.tech
Middle

¿Por qué se debe usar la anotación @Binds en lugar de la anotación @Provides?

sobes.tech AI

Respuesta de la IA

La anotación @Binds se utiliza para indicarle a Dagger qué implementación específica de una interfaz debe proporcionar cuando se solicita la interfaz misma.

Las ventajas de usar @Binds en lugar de @Provides en este caso son:

  • Rendimiento: @Binds es más eficiente, ya que Dagger genera menos código. Simplemente enlaza la interfaz con un tipo concreto sin crear una nueva instancia del módulo.
  • Legibilidad: El código es más claro, ya que se ve claramente qué interfaz es implementada por qué clase.
  • Reducción de código boilerplate: Al usar @Binds, no es necesario escribir un método adicional con @Provides que simplemente devuelve una instancia de la implementación.

Ejemplo:

En lugar de:

@Module
class MyModule {

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

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

Es mejor usar:

@Module
abstract class MyModule { // El módulo debe ser abstracto

    @Binds
    abstract fun bindMyInterface(implementation: MyInterfaceImpl): MyInterface; // El método debe ser abstracto

}

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

La anotación @Provides sigue siendo necesaria para proporcionar objetos que no son implementaciones de interfaces o que requieren lógica de instanciación más compleja (por ejemplo, crear objetos a través de constructores, proporcionar objetos de bibliotecas externas, proporcionar dependencias que no se pueden inyectar a través del constructor).