Middle
Γιατί πρέπει να χρησιμοποιούμε την ετικέτα @Binds αντί για την ετικέτα @Provides;
sobes.tech AI
Απάντηση από AI
Η σημείωση @Binds χρησιμοποιείται για να υποδείξει στο Dagger ποια συγκεκριμένη υλοποίηση μιας διεπαφής πρέπει να παρέχει όταν ζητείται η ίδια η διεπαφή.
Τα πλεονεκτήματα της χρήσης του @Binds αντί του @Provides σε αυτήν την περίπτωση είναι:
- Απόδοση: Το
@Bindsείναι πιο αποδοτικό, καθώς το Dagger παράγει λιγότερο κώδικα. Συνδέει απλώς τη διεπαφή με έναν συγκεκριμένο τύπο χωρίς να δημιουργεί ένα νέο στιγμιότυπο του module. - Αναγνωσιμότητα: Ο κώδικας γίνεται πιο καθαρός, καθώς φαίνεται ξεκάθαρα ποια κλάση υλοποιεί ποια διεπαφή.
- Μείωση boilerplate κώδικα: Χρησιμοποιώντας το
@Binds, δεν χρειάζεται να γράψετε μια επιπλέον μέθοδο με το@Providesπου απλώς επιστρέφει μια υλοποίηση.
Παράδειγμα:
Αντί για:
@Module
class MyModule {
@Provides
fun provideMyInterface(implementation: MyInterfaceImpl): MyInterface {
return implementation;
}
}
interface MyInterface {
// ...
}
class MyInterfaceImpl : MyInterface {
// ...
}
Είναι καλύτερο να χρησιμοποιήσετε:
@Module
abstract class MyModule { // Το module πρέπει να είναι αφηρημένο
@Binds
abstract fun bindMyInterface(implementation: MyInterfaceImpl): MyInterface; // Η μέθοδος πρέπει να είναι αφηρημένη
}
interface MyInterface {
// ...
}
class MyInterfaceImpl : MyInterface {
// ...
}
Η σημείωση @Provides παραμένει απαραίτητη για την παροχή αντικειμένων που δεν είναι υλοποιήσεις διεπαφών ή απαιτούν πιο πολύπλοκη λογική δημιουργίας (π.χ., δημιουργία αντικειμένων μέσω builders, παροχή αντικειμένων από εξωτερικές βιβλιοθήκες, παροχή εξαρτήσεων που δεν μπορούν να ενσωματωθούν μέσω του κατασκευαστή).