Sobes.tech
Middle

Waarom zou je de annotatie @Binds gebruiken in plaats van @Provides?

sobes.tech AI

Antwoord van AI

De annotatie @Binds wordt gebruikt om Dagger aan te geven welke specifieke implementatie van een interface moet worden geleverd wanneer de interface zelf wordt opgevraagd.

De voordelen van het gebruik van @Binds in plaats van @Provides in dit geval zijn:

  • Prestaties: @Binds is efficiënter omdat Dagger minder code genereert. Het koppelt eenvoudig de interface aan een concreet type zonder een nieuw exemplaar van de module te maken.
  • Leesbaarheid: De code wordt duidelijker omdat duidelijk is welke klasse welke interface implementeert.
  • Vermindering van boilerplate-code: Bij gebruik van @Binds is het niet nodig om een extra methode met @Provides te schrijven die gewoon een instantie van de implementatie retourneert.

Voorbeeld:

In plaats van:

@Module
class MyModule {

    @Provides
    fun provideMyInterface(implementation: MyInterfaceImpl): MyInterface {
        return implementation;
    }
}

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

Is het beter om te gebruiken:

@Module
abstract class MyModule { // Het module moet abstract zijn

    @Binds
    abstract fun bindMyInterface(implementation: MyInterfaceImpl): MyInterface; // Methode moet abstract zijn

}

interface MyInterface {
    // ...
}

class MyInterfaceImpl : MyInterface {
    // ...
}

De @Provides-annotatie blijft nodig voor het leveren van objecten die geen implementaties van interfaces zijn of die complexere logica voor het maken van instanties vereisen (bijvoorbeeld het maken van objecten via builders, het leveren van objecten uit externe bibliotheken, het leveren van afhankelijkheden die niet via de constructor kunnen worden geïnjecteerd).