Middle
Por que deve usar a anotação @Binds em vez da anotação @Provides?
sobes.tech IA
Resposta da IA
A anotação @Binds é usada para indicar ao Dagger qual implementação específica de uma interface deve ser fornecida quando a própria interface é solicitada.
As vantagens de usar @Binds em vez de @Provides neste caso são:
- Desempenho:
@Bindsé mais eficiente, pois o Dagger gera menos código. Ele simplesmente liga a interface a um tipo concreto sem criar uma nova instância do módulo. - Legibilidade: O código torna-se mais claro, pois é evidente qual classe implementa qual interface.
- Redução de boilerplate: Ao usar
@Binds, não é necessário escrever um método adicional com@Providesque apenas retorna uma instância da implementação.
Exemplo:
Em vez de:
@Module
class MyModule {
@Provides
fun provideMyInterface(implementation: MyInterfaceImpl): MyInterface {
return implementation;
}
}
interface MyInterface {
// ...
}
class MyInterfaceImpl : MyInterface {
// ...
}
É melhor usar:
@Module
abstract class MyModule { // O módulo deve ser abstrato
@Binds
abstract fun bindMyInterface(implementation: MyInterfaceImpl): MyInterface; // O método deve ser abstrato
}
interface MyInterface {
// ...
}
class MyInterfaceImpl : MyInterface {
// ...
}
A anotação @Provides continua sendo necessária para fornecer objetos que não são implementações de interfaces ou que requerem lógica de instanciamento mais complexa (por exemplo, criar objetos através de construtores, fornecer objetos de bibliotecas externas, fornecer dependências que não podem ser injetadas via construtor).