![translation](https://cdn.durumis.com/common/trans.png)
Ini adalah postingan yang diterjemahkan oleh AI.
Pilih Bahasa
Teks yang dirangkum oleh AI durumis
- Jika kelas bergantung pada satu atau lebih sumber daya secara internal, sebaiknya jangan gunakan kelas utilitas statis dan kelas singleton, dan lebih baik menggunakan injeksi ketergantungan.
- Menggunakan injeksi ketergantungan dapat meningkatkan fleksibilitas, kemampuan penggunaan kembali, dan kemampuan pengujian kelas, dan sumber daya dapat disuntikkan melalui konstruktor, pabrik statis, builder, dll.
- Injeksi ketergantungan dapat digunakan dengan meneruskan sumber daya itu sendiri atau pabrik sumber daya, dan dalam proyek dengan banyak dependensi, menggunakan kerangka kerja ketergantungan lebih efisien.
Jika kelas secara internal bergantung pada satu atau lebih sumber daya, dan sumber daya tersebut memengaruhi operasi kelas, maka singleton dan kelas utilitas statis sebaiknya tidak digunakan.
Sumber daya ini tidak boleh dibuat langsung oleh kelas, melainkan di-passing ke konstruktor. Injeksi dependensi dapat digunakan untuk meningkatkan fleksibilitas, kemampuan penggunaan kembali, dan kemudahan pengujian kelas.
Contoh
Contoh Penggunaan Kelas Utilitas Statis
public class SpellChecker {
private static final Lexicon dictionary = new Lexicon();
private SpellChecker() {
}
public static boolean isValid(String word) {
// logika yang menggunakan dictionary
}
public static List suggestions(String typo) {
// logika yang menggunakan dictionary
}
Kelas utilitas ini mengasumsikan bahwa hanya satu kamus yang digunakan. Namun, dalam praktiknya, kamus mungkin berbeda untuk setiap bahasa, dan bahkan mungkin ada kamus khusus untuk kosa kata khusus.
Contoh Penggunaan Kelas Singleton
public class SpellChecker {
private final Lexicon dictionary = new Lexicon();
public static SpellChecker INSTANCE = new SpellChecker();
private SpellChecker() {
}
public static boolean isValid(String word) {
// logika yang menggunakan dictionary
}
public static List suggestions(String typo) {
// logika yang menggunakan dictionary
}
Kelas singleton juga mengasumsikan bahwa hanya satu kamus yang digunakan, sehingga menimbulkan kelemahan yang sama seperti di atas.
Solusi 1 - Hapus Kata Kunci Final dari Bidang
public class SpellChecker {
private Lexicon dictionary = new Lexicon();
public static SpellChecker INSTANCE = new SpellChecker();
private SpellChecker() {
}
public static void changeDictionary(Lexicon dictionary) {
this.dictionary = dictionary;
}
public static boolean isValid(String word) {
// logika yang menggunakan dictionary
}
public static List suggestions(String typo) {
// logika yang menggunakan dictionary
}
Kata kunci final dapat dihapus dari kamus kelas utilitas statis atau singleton, dan kelas dapat dirancang untuk memungkinkan penggantian kamus dari luar. Namun, pendekatan ini canggung untuk digunakan dan dapat menyebabkan masalah sinkronisasi dalam lingkungan multi-threaded.
Solusi 2 - Gunakan Injeksi Dependensi
public class SpellChecker {
private final Lexicon dictionary;
public SpellChecker(Lexicon dictionary) {
this.dictionary = dictionary;
}
public static boolean isValid(String word) {
// logika yang menggunakan dictionary
}
public static List suggestions(String typo) {
// logika yang menggunakan dictionary
}
Dari contoh di atas, kita dapat melihat bahwa kelas statis dan singleton tidak boleh bergantung pada sumber daya internal. Artinya, sumber daya internal harus diinjeksikan dari luar.
Kelas yang menggunakan injeksi dependensi memiliki keuntungan karena dapat memastikan kekekalan berkat kata kunci final, dan mendukung beberapa instans sumber daya. Selain itu, injeksi dependensi dapat diterapkan tidak hanya dalam konstruktor, tetapi juga dalam pabrik statis dan builder.
Injeksi dependensi tidak hanya dapat meneruskan sumber daya itu sendiri, tetapi juga sering menggunakan pabrik. Pabrik adalah objek yang dapat membuat instans dari tipe tertentu secara berulang saat dipanggil. Pendekatan ini disebut pola pabrik metode, dan Supplier
public static List create(Supplier extends Car> generator) {
...
Kartu wildcard terbatas biasanya digunakan untuk membatasi parameter tipe pabrik. Dengan menggunakan pendekatan ini, klien dapat meneruskan pabrik mana pun selama itu adalah subtipe dari tipe yang mereka tentukan.
Injeksi dependensi meningkatkan fleksibilitas dan kemudahan pengujian, tetapi bisa sangat mahal untuk proyek dengan banyak dependensi. Dalam kasus ini, kerangka kerja injeksi dependensi (Dagger, Guice, Spring, dll.) dapat digunakan untuk mengurangi biaya.