Cara Menggunakan @Scope pada Dagger 2 di Android Studio
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 :
- Tutorial Dasar Dagger 2 - Penggunaan Inject dan Component
- Tutorial Penggunaan Provides dan Module pada Dagger 2
- Mengenal Fungsi dari Qualifier pada Dagger 2 di Android Studio
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;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Scope
@Retention(RUNTIME)
@interface 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 {
private int jumlanPasukan;
UniqueArmy(int jumlanPasukan) {
this.jumlanPasukan = jumlanPasukan;
}
int getJumlanPasukan() {
return jumlanPasukan;
}
}
NormalArmy.javaclass NormalArmy {
private int jumlanPasukan;
NormalArmy(int jumlanPasukan) {
this.jumlanPasukan = jumlanPasukan;
}
int getJumlanPasukan() {
return jumlanPasukan;
}
}
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 int pasukan = 5;
@BattleScope
@Provides
UniqueArmy uniqueArmy(){
return new UniqueArmy(pasukan++);
}
@Provides
NormalArmy normalArmy(){
return new 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 UniqueArmy uniqueArmy;
@Inject 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 {
void 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.java kalian, ubah source codenya kurang lebih seperti berikut ini.
public class MainActivity extends AppCompatActivity {
private ArmyComponent armyComponent;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView reportBattle = findViewById(R.id.report);
Button startBattle = findViewById(R.id.click_me);
armyComponent = DaggerArmyComponent.create();
startBattle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
House house = new House();
armyComponent.inject(house);
String report = "Pasukan DarkKnight "+house.uniqueArmy.getJumlanPasukan()+" Orang\n"
+"Pasukan LightKnight "+house.normalArmy.getJumlanPasukan()+" Orang";
reportBattle.setText(report);
}
});
}
}
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, silakan pelajari pada postingan berikutnya. Terimakasih