Effective Java學習筆記之五:優先使用依賴注入取代硬編碼資源

  • 解釋

有許多類會依賴一個或多個底層的資源,這些資源不應該被直接實例化,例如將該類實現為靜態工具類:

public class Rule5 {
private static final Lexicon dictionary = new Lexicon();
private Rule5() { } // Noninstantiable
public static boolean isValid(String word) {...}
public static List<string> suggestions(String typo) {...}
}
/<string>

或者實現為單例:

public class Rule5 {
private final Lexicon dictionary = new Lexicon();
private Rule5() { }
public static INSTANCE = new Rule5(...);
public boolean isValid(String word) {...}
public List<string> suggestions(String typo) {...}
}
/<string>

以上兩種做法都不夠靈活,不可測試,不支持字典類的替換,比如當Lexicon類不滿足需要,需要替換為其他類時,該代碼不能滿足。

應該把依賴的資源類的實例化工作交出去,然後注入進來,例如:

public class Rule5 {
private final Lexicon dictionary;
public Rule5(Lexicon dictionary) {
this.dictionary = Objects.requireNonNull(dictionary);
}
public boolean isValid(String word) {...}
public List<string> suggestions(String typo) {...}
}
/<string>

依賴注入包括:構造器注入、靜態工廠注入和構建器注入等。

該模式的一種非常實用的變體:向構造函數傳遞一個資源的工廠類。Java8可用Supplier接口來表示此工廠來提供資源的實例。

  • 優點1:極大地提升了類的靈活性、可重用性和可測試性

依賴的底層類的實例化由框架負責,依賴類的變化不會影響使用者。

  • 缺點1:大型項目會比較混亂

大型項目中,可能會有數千個依賴,如果沒有依賴注入框架支持將會非常混亂。

  • 最佳實踐

Spring框架已經成為業界公認的依賴注入標準框架,支持setter注入,構造器注入,工廠方法注入等等,其中,由於構造器注入可能會存在大量的構造器參數,能使程序變得笨拙,特別是當某些屬性是可選的時候。因此通常情況下,Spring開發團隊提倡使用setter注入。需給每個需要注入的屬性設置Setter方法。

Effective Java學習筆記之五:優先使用依賴注入取代硬編碼資源

專業從事軟件研發工作多年,在軟件設計、開發、測試、研發管理等領域裡經驗豐富,感興趣的朋友可以關注我的頭條號,相信一定會有所收穫。

如果有軟件研發方面的問題,可以諮詢我。

謝謝!


分享到:


相關文章: