Sobes.tech
Middle+

Μίλησε για τις σημάνσεις Dagger @Provides και @Binds

sobes.tech AI

Απάντηση από AI

Η σημείωση @Provides χρησιμοποιείται σε modules για τον ορισμό μεθόδων που δημιουργούν στιγμιότυπα εξαρτήσεων. Αυτές οι μέθοδοι σημειώνονται με @Provides και επιστρέφουν τον τύπο της εξάρτησης που παρέχουν. Το σώμα της μεθόδου περιέχει τη λογική δημιουργίας του στιγμιότυπου.

@Module
class AppModule {

    @Provides
    fun provideDatabase(context: Context): AppDatabase {
        // Λογική δημιουργίας βάσης δεδομένων
        return Room.databaseBuilder(context, AppDatabase::class.java, "app-database").build()
    }
}

Η σημείωση @Binds χρησιμοποιείται σε modules για να δηλώσει ότι μια διεπαφή συνδέεται με μια συγκεκριμένη υλοποίηση. Εφαρμόζεται σε αφηρημένες μεθόδους που λαμβάνουν ως παράμετρο την υλοποίηση και επιστρέφουν τη διεπαφή. Ο Dagger παράγει πιο αποδοτικό κώδικα για το @Binds σε σύγκριση με το @Provides, καθώς δεν απαιτείται κλήση μεθόδου για τη δημιουργία του στιγμιότυπου.

@Module
interface AppBindsModule {

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

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

Βασικές διαφορές:

  • Το @Provides χρησιμοποιείται για τη δημιουργία αντικειμένων, συχνά με πιο πολύπλοκη λογική ή εξαρτήσεις.
  • Το @Binds χρησιμοποιείται για τη σύνδεση αφηρημένων τύπων (διεπαφές) με τις συγκεκριμένες υλοποιήσεις τους, κάτι που είναι πιο αποδοτικό όταν δεν υπάρχει πολύπλοκη λογική δημιουργίας.