Sobes.tech
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, παροχή αντικειμένων από εξωτερικές βιβλιοθήκες, παροχή εξαρτήσεων που δεν μπορούν να ενσωματωθούν μέσω του κατασκευαστή).