亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

第5項:固定資源首選使用依賴注入

KnewOne / 2395人閱讀

摘要:滿足此要求的簡單模式是在創(chuàng)建新實例時將資源傳遞給構(gòu)造函數(shù)。依賴注入同樣適用于構(gòu)造函數(shù)靜態(tài)工廠第項和構(gòu)建器第項。將資源工廠傳遞給構(gòu)造函數(shù)就會變成一個有用的模式。這種做法稱為依賴注入,將極大地增強類的靈活性,可重用性和可測試性。

??許多類依賴于一個或多個底層資源。 例如,拼寫檢查器依賴于字典。常見的做法是將這些類實現(xiàn)為靜態(tài)實用程序類(第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 List suggestions(String typo) { ... }
}

??同樣的,將它們作為單例實現(xiàn)的情況并不少見(第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 List suggestions(String typo) { ... }
}

??這些方法都不令人滿意,因為它們假設(shè)只有一本值得使用的字典。 在實踐中,每種語言都有自己的字典,特殊字典用于特殊詞匯。 而且,可能需要使用特殊字典進行測試。 假設(shè)單本字典就足以滿足所有情況,這是一廂情愿的想法。

??你可以嘗試讓SpellChecker支持多個詞典,方法是使字典字段為非final域,并添加一個方法來更改現(xiàn)有拼寫檢查器中的字典,但這在并發(fā)時設(shè)置會很笨拙,容易出錯并且不可行。 靜態(tài)實用程序類和單例不適用于底層資源作為參數(shù)的類(Static utility classes and singletons are inappropriate for classes whose behavior is parameterized by an underlying resource.)。

??所需要的是能夠支持類的多個實例(在我們的示例中為SpellChecker),每個實例都使用客戶端所需的資源(在我們的示例中為字典)。 滿足此要求的簡單模式是在創(chuàng)建新實例時將資源傳遞給構(gòu)造函數(shù)。 這是依賴注入的一種形式:字典是拼寫檢查器的依賴項,并在創(chuàng)建時注入拼寫檢查器。

// 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) { ... }
}

??這種依賴注入很簡單,以至于程序猿用了很多年卻不知道它有一個名稱。雖然我們的拼寫檢查器只有一個資源(字典),但是依賴注入可以使用任意數(shù)量的資源和任意的依賴關(guān)系,它保留了不變性(第17項),因此多個客戶端可以共享依賴對象(假設(shè)客戶端需要相同的底層資源)。依賴注入同樣適用于構(gòu)造函數(shù)、靜態(tài)工廠(第1項)和構(gòu)建器(第2項)。

??將資源工廠傳遞給構(gòu)造函數(shù)就會變成一個有用的模式。工廠是一個對象,通過重復調(diào)用這個工廠可以創(chuàng)建某個類型的實例對象。這些就是工廠方法模式 [Gamma95]。Java 8中引入的Supplier 接口非常適合體現(xiàn)工廠。在輸入上采用Supplier 的方法通常應(yīng)該使用泛型(第31項)約束工廠的類型參數(shù),以允許客戶端傳入創(chuàng)建指定類型的任何子類型的工廠。例如,這是一種使用客戶提供的工廠生成馬賽克來生成每個圖塊的方法:

Mosaic create(Supplier tileFactory) { ... }

??盡管依賴注入極大地提高了靈活性和可測試性,但它可能會使大型項目更加混亂,這些項目通常包含數(shù)千個依賴項。通過使用依賴注入框架,例如Dagger [Dagger],Guice [Guice]或Spring [Spring],可以消除這種混亂。這些框架的使用超出了本書的范圍,但請注意,為手動依賴注入而設(shè)計的API可以輕松地適用于這些框架。

??總之,如果有一個類依賴一個或多個底層資源的類,并且底層資源類影響了類的行為,不要使用單例或靜態(tài)實用程序類來實現(xiàn)它,并且不要讓類直接創(chuàng)建這些資源(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)。相反,將資源或工廠傳遞給構(gòu)造函數(shù)(或靜態(tài)工廠或構(gòu)建器)。這種做法稱為依賴注入,將極大地增強類的靈活性,可重用性和可測試性。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/73935.html

相關(guān)文章

  • 看起來很長但還是有用的Spring學習筆記

    摘要:關(guān)于依賴注入注入的注解提供的注解不僅僅是對象,還有在構(gòu)造器上,還能用在屬性的方法上。與之相反,的限定符能夠在所有可選的上進行縮小范圍的操作,最終能夠達到只有一個滿足所規(guī)定的限制條件。注解是使用限定符的主要方式。 本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog... Spring致力于提供一種方法管理你的業(yè)務(wù)對象。在大量Java EE的應(yīng)用中,隨處可...

    DTeam 評論0 收藏0
  • php面試總結(jié)

    摘要:由一層函數(shù)調(diào)用進入下一層函數(shù)調(diào)用的遞推。此時,中的一個稱為孤兒的類就會收留這個對象。禁止訪問服務(wù)器拒絕請求服務(wù)器找不到請求的頁面服務(wù)器內(nèi)部錯誤壞的網(wǎng)關(guān)一般是網(wǎng)關(guān)服務(wù)器請求后端服務(wù)時,后端服務(wù)沒有按照協(xié)議正確返回結(jié)果。 持續(xù)更新。。。。 php 1. 簡述 php 中的 autoload Autoload 的加載機制,當通過 new 來實例化一個類時,PHP 會通過定義的 autol...

    greatwhole 評論0 收藏0
  • 二章 創(chuàng)建和銷毀對象

    摘要:一個類可以提供一個公共靜態(tài)工廠方法,它僅僅是一第項遇到多個構(gòu)造器參數(shù)時要考慮使用構(gòu)建器靜態(tài)工廠和構(gòu)造器有個共同的局限性他們都不能很好地擴展到大量的可選參數(shù)。 ??本章涉及創(chuàng)建和銷毀對象,包括何時以及如何創(chuàng)建它們,何時以及如何避免創(chuàng)建它們,如何確保它們被及時銷毀,以及如何管理在銷毀之前必須進行的清理操作。 第1項:用靜態(tài)工廠方法代替構(gòu)造器 ??類允許客戶端獲取實例的傳統(tǒng)方法是提供公共構(gòu)造...

    Jeffrrey 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<