Middle
Чаро бояд истифода бурдани @Binds ба ҷои @Provides?
sobes.tech AI
Ҷавоб аз AI
Забележката @Binds се използва за указване на Dagger коя конкретна реализация на интерфейс трябва да предостави, когато се поиска самият интерфейс.
Предимствата на използването на @Binds вместо @Provides в този случай са:
- Производителност:
@Bindsе по-ефективен, тъй като Dagger генерира по-малко код. Той просто свързва интерфейса с конкретен тип, без да създава нов екземпляр на модула. - Четливост: Кодът става по-ясен, тъй като ясно се вижда кой клас реализира кой интерфейс.
- Намаляване на boilerplate кода: При използване на
@Bindsне е необходимо да се пише допълнителен метод с@Provides, който просто връща екземпляр на реализацията.
Пример:
Вместо:
@Module
class MyModule {
@Provides
fun provideMyInterface(implementation: MyInterfaceImpl): MyInterface {
return implementation;
}
}
interface MyInterface {
// ...
}
class MyInterfaceImpl : MyInterface {
// ...
}
По-добре е да се използва:
@Module
abstract class MyModule { // Модулът трябва да бъде абстрактен
@Binds
abstract fun bindMyInterface(implementation: MyInterfaceImpl): MyInterface; // Методът трябва да бъде абстрактен
}
interface MyInterface {
// ...
}
class MyInterfaceImpl : MyInterface {
// ...
}
Забележката @Provides остава необходима за предоставяне на обекти, които не са реализации на интерфейси или изискват по-сложна логика за създаване (например, създаване на обекти чрез билдъри, предоставяне на обекти от външни библиотеки, предоставяне на зависимости, които не могат да бъдат инжектирани чрез конструктора).