제이온

[Effective Java] Item 5. Gunakan Injeksi Ketergantungan, Jangan Sebutkan Sumber Daya Secara Eksplisit

  • Bahasa Penulisan: Bahasa Korea
  • Negara Standar: Semua Negaracountry-flag
  • TI

Dibuat: 2024-04-28

Dibuat: 2024-04-28 13:39

Jika suatu kelas bergantung pada satu atau lebih sumber daya secara internal, dan sumber daya tersebut memengaruhi perilaku kelas, maka sebaiknya hindari penggunaan singleton dan kelas utilitas statis.


Kelas tersebut tidak boleh membuat sumber daya ini secara langsung, melainkan sebaiknya sumber daya yang diperlukan diteruskan ke konstruktor. Injeksi dependensi dapat meningkatkan fleksibilitas, kemampuan penggunaan kembali, dan kemudahan pengujian kelas.


Contoh

Contoh Penggunaan Kelas Utilitas Statis

Kelas utilitas ini mengasumsikan bahwa hanya ada satu kamus yang digunakan. Namun, dalam praktiknya, kamus dapat dibedakan berdasarkan bahasa, bahkan mungkin ada kamus khusus untuk kosakata tertentu.


Contoh Penggunaan Kelas Singleton


Kelas singleton juga mengasumsikan bahwa hanya ada satu kamus yang digunakan, sehingga memiliki kelemahan yang sama seperti di atas.


Solusi 1 - Hapus Kata Kunci Final dari Field


Anda juga dapat mendesain agar dictionary pada kelas utilitas statis atau kelas singleton dapat diganti dengan kamus lain dari luar dengan menghapus kata kunci final. Namun, cara ini tidak praktis dan dapat menyebabkan masalah sinkronisasi dalam lingkungan multi-thread.


Solusi 2 - Gunakan Injeksi Dependensi


Dari contoh ini, kita dapat melihat bahwa kelas statis dan kelas singleton tidak boleh bergantung pada sumber daya internal. Artinya, sumber daya internal sebaiknya disuntikkan dari luar.


Kelas yang menggunakan injeksi dependensi dapat menjamin kekekalan berkat kata kunci final, dan mendukung beberapa instance sumber daya. Selain itu, injeksi dependensi dapat diterapkan tidak hanya pada konstruktor, tetapi juga pada factory statis dan builder.


Injeksi dependensi tidak hanya sebatas meneruskan sumber daya itu sendiri, tetapi juga sering digunakan untuk meneruskan factory sumber daya. Factory adalah objek yang membuat instance dari tipe tertentu berulang kali saat dipanggil. Pola ini disebut pola factory method, dan Supplier<T> di Java 8 adalah contoh sempurna dari factory.



Umumnya, wildcard type yang dibatasi digunakan untuk membatasi parameter tipe factory. Dengan cara ini, klien dapat meneruskan factory apa pun yang merupakan subtipe dari tipe yang ditentukan oleh klien.


Injeksi dependensi meningkatkan fleksibilitas dan kemudahan pengujian, tetapi dapat menjadi mahal untuk proyek dengan banyak dependensi. Dalam kasus ini, Anda dapat menggunakan kerangka kerja injeksi dependensi (seperti Dagger, Guice, Spring, dll.) untuk mengurangi biaya.


Sumber

Komentar0