條目5:依賴注入優(yōu)先于硬編碼資源

許多類依賴一個或者多個底層資源,如:拼寫檢查類依賴于一個字典類

// Inappropriate use of static utility - inflexible & untestable!

? public class SpellChecker {

? ? ? private static final Lexicon dictionary = ...;

? ? ? private SpellChecker() {} // Noninstantiable

? ? ? public static boolean isValid(String word) { ... }

? ? ? public static List suggestions(String typo) { ... }

? }

以上寫法將拼寫檢查類寫成了工具類。

另一種通常的寫法,則寫成了單例類:

// Inappropriate use of singleton - inflexible & untestable!

? public class SpellChecker {

? ? ? private final Lexicon dictionary = ...;

? ? ? private SpellChecker(...) {}

? ? ? public static INSTANCE = new SpellChecker(...);

? ? ? public boolean isValid(String word) { ... }

? ? ? public List suggestions(String typo) { ... }

? }

這兩種寫法都不是令人滿意的,因為這兩種寫法不支持字典類的替換,都假定只提供一種字典類。

缺點如下:

不夠靈活、不可測試

因此

靜態(tài)工具類與單例類都不適用于依賴底層資源的情景

更好的做法是

在創(chuàng)建類實例的時候?qū)⒁蕾囐Y源通過構(gòu)造函數(shù)傳遞進去

這是依賴注入的一種形式:將拼寫檢查類依賴的字典類通過構(gòu)造函數(shù)注入進來

// Dependency injection provides flexibility and testability

? public class SpellChecker {

? ? ? private final Lexicon dictionary;

????????public SpellChecker(Lexicon dictionary) {

????????????this.dictionary = Objects.requireNonNull(dictionary);

????????}

? ? ? public boolean isValid(String word) { ... }

? ? ? public List suggestions(String typo) { ... }

? }

同時,依賴注入還支持多個類依賴同一個底層資源

依賴注入通過構(gòu)造器、靜態(tài)工廠、Builder注入都是等效的

該模式的一種非常實用的變體:向構(gòu)造函數(shù)傳遞一個資源的工廠類

Java8可用Supplier<T>接口來表示此工廠來提供資源的實例

對于使用Supplier<T>作為輸入?yún)?shù)的方法,應(yīng)該提供一個類型限定的參數(shù)作為輸入,允許客戶端傳入一個創(chuàng)建子類的工廠。

Mosaic create(Supplier tileFactory) { ... }

盡管依賴注入極大的提高了靈活性和可測試性,它同時也使大的項目更加雜亂,但是這可以使用依賴注入框架來解決

總之,不要使用單例和工具類來實現(xiàn)一個類依賴另一個底層資源

而應(yīng)該,傳遞資源或者創(chuàng)建資源的工廠到構(gòu)造器(或者工廠方法、builder)

這種實踐將極大的增加類的靈活性、重用性和可測試性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,728評論 18 399
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應(yīng)用。 當JAVA程序違反了JA...
    八爺君閱讀 5,216評論 1 114
  • 總喜歡先寫段文字,再去定題目,第一次使用簡書,想起來最初的時候?qū)懭沼?,日記從初中開始,寫了不知道多少本了,...
    妖小寧閱讀 214評論 0 0
  • 小時候 人家的孩子 升學(xué)了 人家的專業(yè) 畢業(yè)了 人家的實驗結(jié)果 以后了 人家的對象 人家的工作? 人家的房子? 人...
    愛吃沙拉的沙拉少女閱讀 227評論 0 0

友情鏈接更多精彩內(nèi)容