} } class Car { private val engine = Engine() fun start() { engine.start() } } fun main() { val car = Car() car.start() } - Class Car dan Engine saling terhubung erat (tightly coupled). Sehingga ketika ingin membuat Car dengan Engine yang berbeda, Anda harus membuat Class Car baru lagi. - Membuat unit testing menjadi lebih sulit. Karena menggunakan real object Engine yang asli, bukan simulasi. Dependency Injection solusinya
menyuntikkannya ke dalam Class Car. + Tidak saling terikat (loosely coupled), sehingga mesin mudah diubah-ubah (ease to refactor) + Mesin bisa digunakan di mobil lain (reusability) + Mobil mudah dites dengan simulasi mesin (ease of testing with mock) Bagaimana caranya ?
engine: Engine) { fun start() { engine.start() } } fun main() { val engine = Engine() val car = Car(engine) car.start() } • Field Injection class Car { lateinit var engine: Engine fun start() { engine.start() } } fun main() { val car = Car() val engine = Engine() car.engine = engine car.start() } penulisan untuk inisialisasi object berkali-kali bisa menyebabkan kesalahan (error-prone)
setiap kali membuat object (error-prone) + Menghindari penulisan kode yang berulang-ulang yang menyebabkan boilerplate + Menghindari pengaturan lifecycle dan scope secara manual yang bisa menyebabkan memory leaks
dalam dependency injection. • Dibuat di atas Dagger yang sudah teruji dan sangat kokoh (robust). 74% dari Aplikasi Top 10K menggunakan Dagger. • Bedanya yaitu proses yang lebih simpel dan lebih mudah dipelajari.
: AppCompatActivity() { lateinit var engine: Engine override fun onCreate(...) { ... engine = Engine() val car = Car(engine) car.start() } } • After @AndroidEntryPoint class MainActivity : AppCompatActivity() { @Inject lateinit var engine: Engine override fun onCreate(...) { ... val car = Car(engine) car.start() } }
lateinit var engine: Engine override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val car = Car(engine) car.start() } }
: AppCompatActivity() { @Inject lateinit var engine: Engine override fun onCreate(...) { ... val car = Car(engine) car.start() } } • After @AndroidEntryPoint class MainActivity : AppCompatActivity() { @Inject lateinit var car: Car override fun onCreate(...) { ... car.start() } }
... } ...... @AndroidEntryPoint class HomeFragment : Fragment() { private val viewModel: HomeViewModel by viewModels() } + Tanpa ViewModelFactory + Tanpa menggunakan Multi-binding seperti pada Dagger
sehingga menjadi mudah dimodifikasi dan mudah dites. ✓ Automated Dependency Injection digunakan untuk mengurangi boilerplate, error-prone dan memory leak. ✓ Hilt memudahkan Anda dalam membuat Dependency Injection dengan step “ritual” yang lebih ringkas dengan adanya pre-defined scope. ✓ Hilt sudah terintegrasi dengan library Jetpack yang lain sehingga bisa mengurangi jumlah kode.