Sobes.tech
Middle+

Opowiedz o adnotacjach Dagger @Provides i @Binds

sobes.tech AI

Odpowiedź od AI

Adnotacja @Provides jest używana w modułach do definiowania metod tworzących instancje zależności. Metody te oznaczone są @Provides i zwracają typ zależności, którą dostarczają. W ciele metody znajduje się logika tworzenia instancji.

@Module
class AppModule {

    @Provides
    fun provideDatabase(context: Context): AppDatabase {
        // Logika tworzenia bazy danych
        return Room.databaseBuilder(context, AppDatabase::class.java, "app-database").build()
    }
}

Adnotacja @Binds jest używana w modułach do wskazania, że jedna interfejs jest powiązany z konkretną implementacją. Dotyczy to metod abstrakcyjnych, które przyjmują implementację jako parametr i zwracają interfejs. Dagger generuje bardziej wydajny kod dla @Binds w porównaniu do @Provides, ponieważ nie wymaga wywołania metody do tworzenia instancji.

@Module
interface AppBindsModule {

    @Binds
    fun bindRepository(impl: DefaultRepository): Repository
}

interface Repository { /* ... */ }
class DefaultRepository @Inject constructor(): Repository { /* ... */ }

Główne różnice:

  • @Provides służy do tworzenia instancji obiektów, często wymagających bardziej skomplikowanej logiki lub zależności.
  • @Binds służy do powiązania abstrakcyjnych typów (interfejsów) z ich konkretnymi implementacjami, co jest bardziej wydajne, gdy nie ma skomplikowanej logiki tworzenia.