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:
@Bindses 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@Providesque 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).