![translation](https://cdn.durumis.com/common/trans.png)
Bu, AI tarafından çevrilen bir gönderidir.
Dil Seç
Text summarized by durumis AI
- Bir sınıfın içsel olarak bir veya daha fazla kaynağa bağımlılığı varsa, statik yardımcı sınıflar ve singleton sınıflar kullanılmamalıdır, bağımlılık enjeksiyonu kullanılması tercih edilir.
- Bağımlılık enjeksiyonu, sınıfın esnekliğini, yeniden kullanılabilirliğini ve test edilebilirliğini iyileştirmeye yardımcı olabilir; kaynaklar, oluşturucular, statik fabrikalar, oluşturucular vb. aracılığıyla enjekte edilebilir.
- Bağımlılık enjeksiyonu, kaynağın kendisinin veya kaynak fabrikasının verilmesi şeklinde kullanılabilir; bağımlılıkların yoğun olduğu projelere, bağımlılık enjeksiyon çerçevesini kullanmak daha verimli olabilir.
Eğer bir sınıf içsel olarak birden fazla kaynağa bağımlıysa ve bu kaynaklar sınıf davranışını etkiliyorsa, tekil ve statik yardımcı sınıflar kullanılmamalıdır.
Bu kaynaklar, sınıf tarafından doğrudan oluşturulmamalıdır; bunun yerine, gerekli kaynaklar oluşturucuya aktarılmalıdır. Bağımlılık enjeksiyonu yoluyla sınıfın esnekliğini, yeniden kullanılabilirliğini ve test edilebilirliğini artırabilirsiniz.
Örnek
Statik yardımcı sınıf kullanarak örnek
public class SpellChecker {
private static final Lexicon dictionary = new Lexicon();
private SpellChecker() {
}
public static boolean isValid(String word) {
// dictionary'yi kullanan mantık
}
public static List suggestions(String typo) {
// dictionary'yi kullanan mantık
}
Bu yardımcı sınıf, yalnızca bir sözlüğün kullanıldığını varsayar. Ancak gerçekte, sözlükler dile göre ayrı ayrı olabilir ve hatta özel sözcükler için ayrı sözlükler olabilir.
Tekil sınıf kullanarak örnek
public class SpellChecker {
private final Lexicon dictionary = new Lexicon();
public static SpellChecker INSTANCE = new SpellChecker();
private SpellChecker() {
}
public static boolean isValid(String word) {
// dictionary'yi kullanan mantık
}
public static List suggestions(String typo) {
// dictionary'yi kullanan mantık
}
Tekil sınıf da yalnızca bir sözlüğün kullanıldığını varsayar, bu nedenle yukarıdaki dezavantaj ortaya çıkar.
Çözüm 1 - Alanlarındaki final anahtar sözcüğünü kaldırın.
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) {
// dictionary'yi kullanan mantık
}
public static List suggestions(String typo) {
// dictionary'yi kullanan mantık
}
Statik yardımcı sınıfın veya tekil sınıfın dictionary'sindeki final anahtar sözcüğünü kaldırabilir ve dictionary'yi dışarıdan farklı bir sözlükle değiştirebilecek şekilde tasarlayabilirsiniz. Ancak bu yöntem kullanımı zor olabilir ve çoklu iş parçacıklı ortamlarda eşzamanlı sorunlara yol açabilir.
Çözüm 2 - Bağımlılık enjeksiyonu kullanın.
public class SpellChecker {
private final Lexicon dictionary;
public SpellChecker(Lexicon dictionary) {
this.dictionary = dictionary;
}
public static boolean isValid(String word) {
// dictionary'yi kullanan mantık
}
public static List suggestions(String typo) {
// dictionary'yi kullanan mantık
}
Yukarıdaki örnekte, statik sınıfların ve tekil sınıfların içsel olarak kaynağa bağlı olmaması gerektiği görülebilir. Yani içsel kaynaklar dışarıdan enjekte edilmelidir.
Bağımlılık enjeksiyonu kullanılan sınıflar, final anahtar sözcüğü sayesinde değişmezliği garanti edebilir ve birden fazla kaynak örneğini destekler. Ayrıca bağımlılık enjeksiyonu, oluşturucuya ek olarak, statik fabrika ve oluşturucuda da uygulanabilir.
Bağımlılık enjeksiyonu, basitçe kaynağın kendisinin geçirildiği bir yöntemdir, ancak kaynak fabrikasının geçirildiği yöntem de sıklıkla kullanılır. Fabrika, çağrıldığında belirli bir türden örnekleri tekrar tekrar oluşturabilen bir nesnedir. Bu yönteme fabrika yöntemi deseni denir ve Java 8'de Supplier
public static List create(Supplier extends Car> generator) {
...
Genellikle fabrikadaki tür parametresini sınırlamak için sınırlı joker karakter türü kullanılır. Bu yöntemi kullanarak, istemci, belirttiği türün alt türlerinden herhangi birini fabrikaya geçirebilir.
Bağımlılık enjeksiyonu esnekliği ve test edilebilirliği artırır, ancak çok sayıda bağımlılığa sahip projelerde önemli maliyetlere yol açabilir. Bu durumlarda, maliyeti azaltmak için bağımlılık enjeksiyon çerçeveleri (Dagger, Guice, Spring vb.) kullanılabilir.