Tutorial Dasar Dependency Injection Untuk Pemula di Android Studio

Tutorial Dasar Dependency Injection Untuk Pemula di Android Studio

Assalamu'alaikum Warahmatullahi Wabarakatuh.

Senang sekali rasanya saya bisa berbagi tutorial lagi dengan kalian, sudah sekian lama saya tidak memposting tutorial-tutorial mengenai pemrograman Android. Dengan begitu pada kesempatan kali ini saya akan melanjutkan seri tutorial mengenai pemrograman Android Dasar. Pada materi berikut ini kita akan membahas seputar DI atau Dependency Injection.

Mungkin banyak di antara kalian yang sering atau pernah mendengar mengenai Dependency Injection, karena konsep pemrograman ini populer dan banyak digunakan oleh professional android developer, karena dengan menggunakan konsep tersebut maka koding yang kita buat menjadi lebih rapih dan terstruktur.

Lalu apa Dependency Injection itu?. Pengertian singkatnya, merupakan suatu cara untuk mengirimkan objek ke kelas yang membutuhkan. atau  Dependency Inversion Principle is simply a guideline to write loosely-coupled code. Yang artinya konsep untuk mengurangi ketergantungan (interdependency) dari suatu sistem, untuk meminimalisir suatu class agar tidak terikat dengan class lain. Jika sampai disini kalian belum paham betul mengenai DI, mari kita lanjutkan untuk membahasnya lebih detail lagi. Apa kalian sudah Siaap.

OK, Kita lanjut pada pembahasan berikutnya, jika kalian masih bingung, pada tutorial ini, kita akan mencoba membuat project sederhana dengan menerapkan konsep DI, mungkin jika kalian pernah melihat lihat tutorial DI di website lain, pasti pembahasannya selalu kompleks dan untuk orang awam pasti sulit untuk di pahaminya, karena sebelum itu juga saya sudah merasakan gimana sulitnya mempelajari tutorial DI ini.

Materi lainnya yang direkomndasikan:

Untuk itu disini saya akan membuat tutorial se-sederhana mungkin, untuk contoh kasusnya, disini kita akan membuat 2 buah project yang berbeda, yang pertaman yaitu project aplikasi Tanpa DI dan yang kedua yaitu aplikasi dengan Menggunakan DI, agar kalian dapat memahami perbedaan dari ke 2 cara tersebut.

Pada contoh kasus ini, kita akan membuat sebuah cerita dimana ada 2 buah kelompok yang ingin berperang, kelompok tersebut bernama LightKnight dan DarkKhight, pada masing-masing kelompok tersebut membutuhkan senjata, Nah di akhir nanti kita akan menampilkan sanjata apa yang digunakan oleh ke dua kelompok tersebut.

Aplikasi yang akan dibuat juga tidak ribet hanya menggunakan 1 TextView dan Button saja. jika penasaran dan masih bingung, coba perhatikan tutorial beirkut ini.

Membuat Project Tanpa Dependency Injection

Sebelum kita belajar menggunakan Dependency Injection, ada baiknya kita juga mencoba membuat project tanpa Dependency Injection terlebih dahulu, supaya kalian bisa lebih memahami perbedaan antar keduannya.

1) Buka Android Studio kalian, buat project baru, misalnya bernama "Belajar DI".

2) Nah Selanjutnya kita akan membuat beberapa Class, yaitu DarkKnight.java, LightKhight.java dan Senjata.java. Semua Class-class tersebut akan di eksekusi didalam class MainActivity.java.

3) Pertama kita buat class Senjata.java nya tersebut, nantinya class ini akan di akses oleh class lain yang membutuhkan. kode yang akan kita buat pada class ini cukup sederhana.
package com.wildan.belajardi;

//Class ini nantinya akan diakses oleh Class LightKnight dan DarkKnight
class Senjata {

    //Membuat 2 Buah Fungsi yang Mengenbalikan Nilai String dengan Data Berbeda
    String tombak(){ return "Tombak"; }
    String pedang(){ return "Pedang"; }
}

Coba kalian perhatikan, didalam class tersebut terdapat 2 buah Fungsi yang mengembalikan nilai String yang berbeda, diibaratkan sebelum perang kita perlu menyiapkan senjatanya dulu kan.

4) Selanjutnya kita buat Class DarkKnight.java, untuk source codenya seperti berikut ini.
package com.wildan.belajardi;

class DarkKnight {

    //Membuat Instance / Objek dari Class Senjata
    private Senjata senjata = new Senjata();

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

Seperti yang sudah saya jelaskan sebelumnya, sebelum berberang kelompok tersebut membutuhkan senjata. Didalam class tersebut pertama kita membuat objek dari class Senjata, agar data didalam class tersebut bisa di akses. lalu dialam fungsi setEquip() akan mengembalikan nilai String serta memanggil fungsi tombak() dari class Senjata. Ceritanya kelompok ini memilih senjata tombak untuk berperang.

5) Lalu buat class berikutnya yaitu Class LightKnight.java, untuk source codenya hampir sama dengan class sebelumnya, seperti berikut ini.
package com.wildan.belajardi;

class LightKnight {

    //Membuat Intance / Objek dari Class Senjata
    private Senjata senjata = new Senjata();

    //Membuat Fungsi yang mengembalikan Nilai String
    String setEquip() {
        return "Kolempok LightKnight Bertempur Menggunakan " + senjata.pedang();
    }
}

Hampir sama dengan class sebelumnya, cuma yang membedakan yaitu isi dari Fungsi setEquip() tersebut, dialamnya kita memanggil fungsi pedang() dari Class Senjata.

6) Setelah membuat ke tiga class tersebut terakhir kita buka Class MainActivity nya. sebelum itu kita desain dulu tampilan layoutnya, kita cukup menambahkan TextView dan Button saja.

xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" 
        android:padding="32dp">

    <Button
            android:text="Coba Klik"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/click_me"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>
    
    <TextView
            android:text="Report Battle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/report" 
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent" 
            android:textStyle="bold"
            android:textSize="16sp"
            android:gravity="center"/>
    
</android.support.constraint.ConstraintLayout>

view:

Screenshot_layout_belajar_DI

7) Setelah kita membuat layout activity_main nya, lalu buka class MainActivity.java. disini kita akan memanggil kedua class tersebut yaitu Dark dan Light Knight lalu manampilkan hasilnya pada TextView.
package com.wildan.belajardi;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @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);

        //Membuat Instance atau Objec dari Class Light dan Dark Night
        final LightKnight lightKnight = new LightKnight();
        final DarkKnight darkKnight = new DarkKnight();

        //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);
            }
        });
    }
}

Pertama kita Deklarasi dan Inisialisasikan View akan digunakan lalu memebuat instance atau objek dari class DarkKnight dan LightKnight, setelah itu tambahkan listener pada Button tersebut lalu didalamnya kita membuat Variable String bernama getReport, pada variable tersebut kita memanggil fungsi setEquip dari objek lightKnight dan darkKnight, lalu memasukan variable tersebut pada TextView.

Demo:

Screenshot_project_DI_sederhana


Jika kita lihat dengan kasat mata, tidak ada yang salah dengan implementasi kode di atas, tapi jika class Senjata, digunakan untuk banyak class (selain DarkKnight dan LightKnight)
tentunya hal ini berujung pada hardcoded dependency, apabila ada perubahan pada class Senjata, maka harus ada perubahan juga pada class DarkKnight dan LightKnight.

Terus kalo cuma 2 clas itu saja yang di rubah gak ribet dong ya. iya sih tapi suatu saat nanti class Senjata tersebut bisa saja kan di gunakan untuk class lainnya, misalnya ada 10 class yang menerima objek dari class tersebut, maka jika ada perubahan, otomatis kita juga harus mengubah satu-satu dari 10 class yang menerima objek tersebut, tentunya ini menyulikan programmer dan aplikasi akan sulit untuk di extend.

Membuat Project Dengan Dependency Injection

Selanjutnya kita akan mengubah kode project tersebut dengan meng-implementasikan Dependency Injection. Sudah saya jelaskan sebelumnya jika tanpa DI class yang ingin menerima data dari class lainnya, maka class tersebut haru dibuatkan objek.

Dengan menerapkan prinsip DI, maka class DarkKnight dan LightKnight tidak harus mengurusi inisialisasi dari class Senjata, kedua class tersebut cukup menerima objek dari class Senjata saja. lalu bagaimana caranya. ya satu-satunya cara yaitu dengan menggunakan Constructor. Seperti berikut ini,

DarkKnight.java
package com.wildan.belajardi;

class DarkKnight {

    //Membuat Variable dari Class Senjata
    private Senjata senjata;

    //Membuat Constructor untuk menerima objek dari class Senjata
    DarkKnight(Senjata senjata) {
        this.senjata = senjata;
    }

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

LightKnight.java
package com.wildan.belajardi;

class LightKnight {

    //Membuat Variable dari Class Senjata
    private Senjata senjata;

    //Membuat Constructor untuk menerima objek dari class Senjata
    LightKnight(Senjata senjata) {
        this.senjata = senjata;
    }

    //Membuat Fungsi yang mengembalikan Nilai String
    String setEquip() {
        return "Kolempok LightKnight Bertempur Menggunakan " + senjata.pedang();
    }
}

Berbeda dengan yang sebelumnya, pada class tersebut kita hanya membuat variable dari class Senjata dan untuk inisialisasi objeknya akan didapatkan melalui Constructor.

Lalu setelah itu kita buka class MainActivity, disini kita buat objek dari class tersebut. Nah pebedaan nya, dengan menggunakan prinsip DI, semua objek hanya akan dibuat pada class MainActivity saja, jadi tidak perlu membuat objek Senjata pada masing-masing class yang membutuhkan.
final LightKnight lightKnight = new LightKnight();
final DarkKnight darkKnight = new DarkKnight();

Didalam method onCreate() kedua objek tersebut akan error, karena memerlukan parameter dari objek class Senjata, maka dari itu kita perlu membuat objek Senjata seperti berikut ini.
//Membuat Objek dari Class Senjata
final Senjata senjata = new Senjata();

//Membuat Instance atau Objec dari Class Light dan Dark Night
final LightKnight lightKnight = new LightKnight(senjata);
final DarkKnight darkNight = new DarkKnight(senjata);

Terakhir jalankan project tersebut maka hasilnya akan sama seperti yang sebelumnya. Jadi intinya semua Instance atau Objek hanya akan dibuat didalam class MainActivity saja, lalu apa maksudnya dengan "Jika ada perubahan pada Class Senjata maka class yang lainnya juga harus di ubah".

Nah satu point lagi nih yang akan saya jelaskan, semoga saja kalian paham yaa. Contoh sederhananya seperti ini, misalnya kita tambahkan parameter didalam constructor pada Class Senjata. seperti ini.
package com.wildan.belajardi;

//Class ini nantinya akan diakses oleh Class LightKnight dan DarkNight
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;
    }
}

Maka kode yang harus kita ubah juga cukup pada MainActivity saja, seperti berikut ini.
//Membuat variable untuk memberi nama pada senjata yang akan digunakan
String namaPedang = "Pedang Api";
String namaTombak = "Tombak Petir";
        
//Membuat Objek dari Class Senjata dengan Parameter
final Senjata senjata = new Senjata(namaPedang, namaTombak);

//Membuat Instance atau Objec dari Class Light dan Dark Night
final LightKnight lightKnight = new LightKnight(senjata);
final DarkKnight darkNight = new DarkKnight(senjata);

Cukup mudah bukan, jika tanpa menggunakan DI, maka kita harus mengubah kode pada class LightKnight dan DarkKnight, tapi dengan menggunakan prinsip DI, maka data yang harus di ubah cukup pada MainActivity saja.

Demo:

Screenshot_belajar_DI

Itulah tutorial yang bisa saya share pada kalian, semoga bermanfaat. Oh iya ngomong-ngomog tentang Dependency Injection, pastinya di antara kalian pernah mendengar mengenai Library Dagger 2, Nah library ini sangat populer dan banyak digunakan oleh android developer karena dapat memudahkan kita dalam menerapkan konsep DI.

Jika pada tutorial sebelumnya hanya MainActivity saja yang digunakan untuk mengeksekusi kode, tapi bagaimana jika banyak class atau activity yang harus mengeksekusi kode tersebut, pastinya ribet juga kan, kita harus membuat objek lagi pada pada masing-masng class activity yang membutuhkan.

Salah satu solusinya yaitu dengan menggunakan Dagger 2, library ajaib ini sangat ampuh untuk menyelesaikan permasalahan tersebut. disini saya akan menjelaskannya pada Tutorial Berikutnya. Ditunggu aja yaa, Terimakasih.

Wassalamu'alaikum Warahmatullahi Wabarakatuh.

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