摘要:滿足此要求的簡單模式是在創建新實例時將資源傳遞給構造函數。依賴注入同樣適用于構造函數靜態工廠第項和構建器第項。將資源工廠傳遞給構造函數就會變成一個有用的模式。這種做法稱為依賴注入,將極大地增強類的靈活性,可重用性和可測試性。
??許多類依賴于一個或多個底層資源。 例如,拼寫檢查器依賴于字典。常見的做法是將這些類實現為靜態實用程序類(第4項):
// 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 Listsuggestions(String typo) { ... } }
??同樣的,將它們作為單例實現的情況并不少見(第3項):
// 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 Listsuggestions(String typo) { ... } }
??這些方法都不令人滿意,因為它們假設只有一本值得使用的字典。 在實踐中,每種語言都有自己的字典,特殊字典用于特殊詞匯。 而且,可能需要使用特殊字典進行測試。 假設單本字典就足以滿足所有情況,這是一廂情愿的想法。
??你可以嘗試讓SpellChecker支持多個詞典,方法是使字典字段為非final域,并添加一個方法來更改現有拼寫檢查器中的字典,但這在并發時設置會很笨拙,容易出錯并且不可行。 靜態實用程序類和單例不適用于底層資源作為參數的類(Static utility classes and singletons are inappropriate for classes whose behavior is parameterized by an underlying resource.)。
??所需要的是能夠支持類的多個實例(在我們的示例中為SpellChecker),每個實例都使用客戶端所需的資源(在我們的示例中為字典)。 滿足此要求的簡單模式是在創建新實例時將資源傳遞給構造函數。 這是依賴注入的一種形式:字典是拼寫檢查器的依賴項,并在創建時注入拼寫檢查器。
// 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 Listsuggestions(String typo) { ... } }
??這種依賴注入很簡單,以至于程序猿用了很多年卻不知道它有一個名稱。雖然我們的拼寫檢查器只有一個資源(字典),但是依賴注入可以使用任意數量的資源和任意的依賴關系,它保留了不變性(第17項),因此多個客戶端可以共享依賴對象(假設客戶端需要相同的底層資源)。依賴注入同樣適用于構造函數、靜態工廠(第1項)和構建器(第2項)。
??將資源工廠傳遞給構造函數就會變成一個有用的模式。工廠是一個對象,通過重復調用這個工廠可以創建某個類型的實例對象。這些就是工廠方法模式 [Gamma95]。Java 8中引入的Supplier
Mosaic create(Supplier extends Tile> tileFactory) { ... }
??盡管依賴注入極大地提高了靈活性和可測試性,但它可能會使大型項目更加混亂,這些項目通常包含數千個依賴項。通過使用依賴注入框架,例如Dagger [Dagger],Guice [Guice]或Spring [Spring],可以消除這種混亂。這些框架的使用超出了本書的范圍,但請注意,為手動依賴注入而設計的API可以輕松地適用于這些框架。
??總之,如果有一個類依賴一個或多個底層資源的類,并且底層資源類影響了類的行為,不要使用單例或靜態實用程序類來實現它,并且不要讓類直接創建這些資源(do not use a singleton or static utility class to implement a class that depends on one or more underlying resources whose behavior affects that of the class)。相反,將資源或工廠傳遞給構造函數(或靜態工廠或構建器)。這種做法稱為依賴注入,將極大地增強類的靈活性,可重用性和可測試性。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73935.html
摘要:關于依賴注入注入的注解提供的注解不僅僅是對象,還有在構造器上,還能用在屬性的方法上。與之相反,的限定符能夠在所有可選的上進行縮小范圍的操作,最終能夠達到只有一個滿足所規定的限制條件。注解是使用限定符的主要方式。 本文首發于泊浮目的專欄:https://segmentfault.com/blog... Spring致力于提供一種方法管理你的業務對象。在大量Java EE的應用中,隨處可...
摘要:由一層函數調用進入下一層函數調用的遞推。此時,中的一個稱為孤兒的類就會收留這個對象。禁止訪問服務器拒絕請求服務器找不到請求的頁面服務器內部錯誤壞的網關一般是網關服務器請求后端服務時,后端服務沒有按照協議正確返回結果。 持續更新。。。。 php 1. 簡述 php 中的 autoload Autoload 的加載機制,當通過 new 來實例化一個類時,PHP 會通過定義的 autol...
摘要:一個類可以提供一個公共靜態工廠方法,它僅僅是一第項遇到多個構造器參數時要考慮使用構建器靜態工廠和構造器有個共同的局限性他們都不能很好地擴展到大量的可選參數。 ??本章涉及創建和銷毀對象,包括何時以及如何創建它們,何時以及如何避免創建它們,如何確保它們被及時銷毀,以及如何管理在銷毀之前必須進行的清理操作。 第1項:用靜態工廠方法代替構造器 ??類允許客戶端獲取實例的傳統方法是提供公共構造...
閱讀 2241·2021-11-24 11:15
閱讀 3091·2021-11-24 10:46
閱讀 1389·2021-11-24 09:39
閱讀 3927·2021-08-18 10:21
閱讀 1484·2019-08-30 15:53
閱讀 1400·2019-08-30 11:19
閱讀 3328·2019-08-29 18:42
閱讀 2326·2019-08-29 16:58