Sobes.tech
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 остава необходима за предоставяне на обекти, които не са реализации на интерфейси или изискват по-сложна логика за създаване (например, създаване на обекти чрез билдъри, предоставяне на обекти от външни библиотеки, предоставяне на зависимости, които не могат да бъдат инжектирани чрез конструктора).