Tutorial Penggunaan Provides dan Module pada Dagger 2

Tutorial Penggunaan Provides dan Module pada Dagger 2

Assalamu'alaikum Warahmatullahi Wabarakatuh.

Alhamdullilah pada kesempatan ini saya bisa berjumpa kembali bersama kalian, disini kita akan melanjutkan seri tutorial dari Dagger 2. Pada tutorial sebelumnya kita sudah membahas mengenai Anotasi Inject dan Component, walaupun  baru 2 anotasi yang kita gunakan, tapi sangat berguna sekali dalam menerapkan konsep Dependency Injection.

Tidak Cukup sampai disitu, karena masih banyak Anotas-anotasi ajaib dari Library Dagger 2. Maka dari itu setelah kita mempelajari Inject dan Component, selanjutnya kita akan bahas mengenai anotasi Provides dan Module.

Anotasi Module digunakan untuk menandai class yang akan dijadikan module dan provides digunakan untuk menandai suatu method yang terdapat didalam class module, method ini berperan sebagai penyedia dependensi. Jika masih bingung mari kita coba implementasikan pada project sebelumnya.

Menerapkan Module dan Provides pada Project

Disini kita akan coba menerapkan Anotasi Module dan Provides didalam project android sebelumnya, walaupun contoh berikut ini sangat sederhana, karena agar kalian dapat dengan mudah untuk memahami tutorial yang saya berikan.

1) Buka kembali class Senjata.java yang sudah kalian buat pada tutorial sebelumnya. Kodenya kurang lebih seperti berikut ini.
class Senjata{

    //Deklarasi variable yang di butuhkan
    private String namaPedang;
    private String namaTombak;

    //Membuat Konstruktor untuk menentukan Nama senjata yang akan di pilih
    Senjata(String namaPedang, String namaTombak) {
        this.namaPedang = namaPedang;
        this.namaTombak = namaTombak;
    }

    //Membuat 2 Buah Fungsi yang Mengenbalikan Nilai String dengan Data Berbeda
    String tombak(){
        return namaTombak;
    }
    String pedang(){
        return namaPedang;
    }
}
Coba kalian perhatikan, untuk contoh kasus berikut ini, didalam class tersebut terdapat Constructor dengan 2 parameter yaitu data String, artinya class tersebut memerlukan 2 data String dan wajib diisi, lalu bagaimana cara untuk mengisi data tersebut.

Jika tidak menggunakan Dagger 2 (Manual Dependency Injection), maka parameter tersebut akan kita Inisialisasikan pada MainActivity.java pada saat membuat objek dari class Senjata. contohnya seperti ini.
Senjata senjata = new Senjata("Pedang Larva", "Pedang Halilintar");
Sebenarnya tidak ada yang salah dengan contoh kode tersebut, kalo cuma di MainActivity saja, tapi bagaimana jika ada class lain juga yang ingin mengakses class Senjata, pastinya kita juga perlu membuat instance dari class tersebut satu-per-satu kan, kalo gitu bakalan ribet nantinya.

Solusinya dengan menggunakan Dagger 2, kita hanya cukup sekali saja untuk inisialisasi Constructor beserta Parameternya yaitu didalam class Module.

2) Selanjutnya kita buat class Module nya, buat class baru, berinama class tersebut misalnya "BattleModule", untuk contoh kodenya kurang lebih seperti berikut ini,
import dagger.Module;
import dagger.Provides;

@Module
class BattleModule {

    //Menyediakan Dependenci yang akan digunakan dengan Parameter didalam Class Senjata
    @Provides
    Senjata setSenjata(){
        return new Senjata("Pedang Larva", "Tombak Halilintar");
    }
}
Didalam class tersebut terdapat sebuah method bernama setSenjata() yang ditandai dengan anotasi Provides, method ini digunakan sebagai penyedia dependenci yang akan digunakan, method tersebut akan mengembalikan nilai berupa Objek dari Class Senjata beserta parameternya, Jadi kita cukup inisialisasikan data didalam parameter tersebut di class ini saja.

Jadi kita tidak perlu membuat Instance beserta Parameternya di class lain. Perlu kalian ketahui, untuk penamaan methodnya bisa dengan nama apa saja, terserah. Pasti kalian berfikir bahwa method tersebut akan kita panggil pada class yang membutuhkan, sebenarnya tidak, ajaibnya method tersebut tidak harus kita panggil di class lain, kita cukup membuatnya didalam class Module.

3) Buka kembali class interface BattleComponent, disini kita akan menambahkan class BattleModule pada class Component tersebut.
import dagger.Component;

@Component(modules = {BattleModule.class})
interface BattleComponent {
    void inject(MainActivity context);
}
Pada anotasi Component kita menambahkan Class BattleModule, karena interface tersebut berperan untuk menghubungkan atau menjembatani antara Module dengan data yang di Inject, seperti biasa didalam interface tersebut terdapat method untuk menentukan class mana yang akan menerima Inject.

4) Pada class DarkKnight dan LightKnight, kita cukup menambahkan Parameter pada constructornya dan membuat variable dari Class Senjata, seperti ini.

DarkKnight.java
import javax.inject.Inject;

class DarkKnight {

    //Membuat Variable dari class senjata
    private Senjata senjata;

    @Inject
    DarkKnight(Senjata senjata) {
        this.senjata = senjata;
    }

    //Membuat Fungsi yang Mengembalikan Nilai String
    String setEquip(){
        return "Kolempok DarkKnight Bertempur Menggunakan "+senjata.tombak() ;
    }
}

LightKnight.java
import javax.inject.Inject;

class LightKnight{

    //Membuat Variable dari class senjata
    private Senjata senjata;

    @Inject
    LightKnight(Senjata senjata) {
        this.senjata = senjata;
    }

    //Membuat Fungsi yang mengembalikan Nilai String
    String setEquip() {
        return "Kolempok LightKnight Bertempur Menggunakan "+senjata.pedang();
    }
}
Setelah itu jangan lupa untuk Rebuild project tersebut.

5) Buka class MainActivity,java kalian, untuk source codenya tidak jauh berbeda, seperti berikut ini.
public class MainActivity extends AppCompatActivity {

    //Deklarasi Variable dengan menggunakan Anotasi Inject
    @Inject DarkKnight darkKnight;
    @Inject LightKnight lightKnight;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Deklarasi dan Inisialisasi View
        final TextView reportBattle = findViewById(R.id.report);
        Button startBattle = findViewById(R.id.click_me);

        //Mendapatkan Konteks dari class yang bersangkutan
        DaggerBattleComponent.create().inject(this);

        //Menambahkan listener pada Button
        startBattle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Menampilkan Data pada TextView yang diambil dari Fungsi setEquip dari kedua Class tersebut
                String getReport = lightKnight.setEquip() + " dan " + darkKnight.setEquip();
                reportBattle.setText(getReport);
            }
        });
    }
Terakhir, jalankan project tersebut.

Demo:

Screenshot_ProjectDI

Pada tutorial berikutnya kita akan belajar cara menggunakan fungsi Qualifier pada Dagger 2, sekian tutorial dari saya, semoga bermanfaat, jika ada pertanyaan, silakan isi kolom komentar dibawah ini.

Wassalamu'alaikum Warahmatullahi Wabarakatuh.

Wildan M Athoillah
Wildan M Athoillah Blogger dan spesialis pembuat aplikasi android.