Penggunaan @Scope pada Dagger 2 Menggunakan Kotlin


Assalamu'alaikum Warahmatullahi Wabarakatuh.

Pada materi sebelumnya kita telah mempelajari beberapa komponen penting dari Dagger 2, yaitu @Inject, @Module, @Provides dan @Component. Tapi sebenarnya banyak komponen lainnya dari Dagger 2 yang dapat membantu developer untuk menerapkan Konsep Depenency Injction.

Apa beberapa Anotasi pada Dagger 2 yang dapat membantu kita di belakang layar, seperti @Qualifier, yang telah kita bahas sebelumnya, selain itu juga ada lagi yaitu @Scope, anotasi tersebut tentunya sangat penting. Lalu apa fungsi dari Anotasi @Scope


Saat menerapkan prinsi Dependency Injection pastinya kita diharuskan untuk membuat Instance atau Objek dari class yang di tuju, secara default objek dari class yang kita buat dapat kita buat dan memanggilnya berulang-ulang jika di eksekusi. Tapi bagaimana jika kita ingin membuat class unique atau kelas unik yang hanya dapat di panggil 1 kali saja.

Materi sebelumnya yang harus kalian pelajari :
  1. Tutorial Dasar Dependency Injection Pada Kotlin di Android Studio
  2. Belajar Inject dan Component pada Dagger 2 Menggunakan Kotlin
  3. Library Dagger 2 - Provides dan Module Menggunakan Kotlin
  4. Dagger 2 Menggunakan Kotlin - Penggunaan Anotasi Qualifier

Disinilah peranan dari @Scope, antasi tersebut dapat digunakan untuk menendai class mana yang akan dibuat unik. Hampir sama seperti @Qualifier, kita diharuskan untu membuat anotasi baru turunan dari @Scope. Pada materi ini kita akan coba mengubah dan menambahkan beberapa kode pada project yang telah kita buat sebelumnya.

Pahlawan Di Belakang Layar - @Scope

Didalam project tersebut kita akan membuat beberapa class baru, untuk mencontohkan bagaimana anotasi Scope dapat bekerja.

1) Buat class interface baru bernama "BattleScope", class ini digunakan untuk membuat anotasi baru turunan dari Scope, kalian juga dapat memberikan nama class tersebut bebas.
import javax.inject.Scope

@Scope
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
annotation class BattleScope
Hampir sama seperti saat kita membuat anotasi dari @Qualifier, kita tinggal menambahkan anotasi @Scope pada class tersebut, nantinya @BatteScope ini digunakan untuk menandai class mana yang dibuat menjadi unik / tidak dapat dibuat kembali.

2) Buat class baru bernama UniqueArmy dan NormalArmy, class ini digunakan sebagai sample untuk membedakan class yang menggunakan @BattleScope dan yang tidak.

UniqueArmy.java
class UniqueArmy(val jumlahPasukan: Int)
NormalArmy.java
class NormalArmy(val jumlahPasukan: Int)
Terdapat 2 class yang kodenya hampir sama, didalam class tersebut mempunyai data integer untuk mengitung jumlah pasukan mereka. Perbedaannya pada class UniqueArmy akan kita tambahkan Anotasi @BattleScope didalam class module, yang menandakan bahwa class tersebut unik.

3) Buat class baru bernama "ArmyModule" class ini digunakan sebagai class module kita yang menyimpan dependency yang akan digunakan.
import dagger.Module
import dagger.Provides

@Module
class ArmyModule {

    private var pasukan = 5

    @BattleScope
    @Provides
    fun uniqueArmy(): UniqueArmy {
        return UniqueArmy(pasukan++)
    }

    @Provides
    fun normalArmy(): NormalArmy {
        return NormalArmy(pasukan++)
    }
}
Pertama kita deklarasikan variable integer dengan nilai default = 5, lalu pada UniqueArmy, kita tambahkan @BattleScope untuk menendakan bahwa class tersebut unik dan hanya dapat dipanggil 1 kali saja. Pada masing-masing class kita menambahkan pasukan++ agar kalian dapat melihat perbedaan dari kedua class tersebut.

4) Buat class baru lagi bernama "House", class ini digunakan untuk menyimpan kedua class tadi, yaitu UniqueArmy dan NormalArmy, dan jangan lupa untuk menambahkan anotasi @Inject juga agar kedua class tersebut dapat di inject di kelas lainnya.
import javax.inject.Inject

class House {
    @Inject
    lateinit var uniqueArmy: UniqueArmy
    @Inject
    lateinit var normalArmy: NormalArmy
}
5) Selanjutnya buat class baru bernama "ArmyComponent", class ini digunakan untuk menjembatani atau menghubungkan antara module dengan data yang akan di Inject.
import dagger.Component

@BattleScope
@Component(modules = [ArmyModule::class])
interface ArmyComponent {
    fun inject(house: House)
}
Pertama kita tentukan class module yang akan digunakan lalu didalam class tersebut terdapat suatu method yang menerima inject yaitu class House. Jangan lupa untuk Rebuild project tersebut.

6) Terakhir buka MainActivity kalian, ubah source codenya kurang lebih seperti berikut ini.
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    private var armyComponent: ArmyComponent? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        armyComponent = DaggerArmyComponent.create()

        click_me.setOnClickListener {
            val house = House()
            armyComponent!!.inject(house)
            val reportBattle = ("Pasukan DarkKnight " + house.uniqueArmy.jumlahPasukan + " Orang\n"
                    + "Pasukan LightKnight " + house.normalArmy.jumlahPasukan + " Orang")

            report.text = reportBattle
        }
    }
}
Buat variable dari class ArmyComponent, lalu didalam method onCreate(), inisialisasi class DaggerComponent nya, selanjutnya saat tombol di klik, maka class House akan dibuat terus menerus bersama class didalamnya yaitu UniqueArmy dan NormalArmy.

Demo:


Jika kita klik terus menerus pada buttom tersebut, maka class Unique nilainnya tidak akan berubah, dan yang normalArmy akan terus berubah, karena class tersebut tidak unik atau dapat di panggil berkali-kali.

Sekian tutorial dari saya, semoga bermanfaat, jangan lupa masih ada 1 materi lagi mengenai Dagger 2, yaitu penggunaaan Anotasi @Singleton dengan menggunakan Bahasa Pemrograman Kotlin, silakan pelajari pada postingan berikutnya. Terimakasih

Wassalamu'alaikum Warahmatullahi Wabarakatuh.

Disqus Comments