Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

这是AI翻译的帖子。

제이온

[Effective Java] 项目 5. 不要显式地使用资源,而应该使用依赖注入

  • 写作语言: 韓国語
  • 基准国家: 所有国家 country-flag

选择语言

  • 汉语
  • English
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

durumis AI 总结的文章

  • 如果类在内部依赖于一个或多个资源,则最好不要使用静态实用程序类和单例类,而应该使用依赖注入。
  • 使用依赖注入可以提高类的灵活性、可重用性和可测试性,并且可以在构造函数、静态工厂、构建器等中注入资源。
  • 依赖注入可以通过传递资源本身或资源工厂来使用,对于依赖关系较多的项目,使用依赖注入框架是高效的。

如果類別內部依賴於一個或多個資源,而這些資源會影響類別的操作,則最好不要使用單例和靜態實用程序類別。


不應讓類別直接創建這些資源,而是應將必要的資源傳遞給構造函數。通過依賴項注入,可以改善類別的靈活性、可重用性和可測試性。


範例

使用靜態實用程序類別的範例

public class SpellChecker {

    private static final Lexicon dictionary = new Lexicon();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // 使用字典的邏輯
    }

    public static List suggestions(String typo) {
        // 使用字典的邏輯
    }

此實用程序類別假設只使用一個字典。但是,在現實世界中,字典可能因語言而異,甚至可能為特殊詞彙單獨使用字典。


使用單例類別的範例

public class SpellChecker {

    private final Lexicon dictionary = new Lexicon();

    public static SpellChecker INSTANCE = new SpellChecker();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // 使用字典的邏輯
    }

    public static List suggestions(String typo) {
        // 使用字典的邏輯
    }


單例類別也假設只使用一個字典,因此會出現與上述相同的缺點。


解決方案 1 - 從欄位中移除 final 關鍵字。

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) {
        // 使用字典的邏輯
    }

    public static List suggestions(String typo) {
        // 使用字典的邏輯
    }


可以從靜態實用程序類別或單例類別的字典中移除 final 關鍵字,並設計允許從外部替換字典的機制。但是,這種方法本身難以使用,並且在多線程環境中可能會導致同步問題。


解決方案 2 - 使用依賴項注入。

public class SpellChecker {

    private final Lexicon dictionary;

    public SpellChecker(Lexicon dictionary) {
        this.dictionary = dictionary;
    }

    public static boolean isValid(String word) {
        // 使用字典的邏輯
    }

    public static List suggestions(String typo) {
        // 使用字典的邏輯
    }


通過上述範例,可以感受到靜態類別和單例類別不應該依賴於內部資源。也就是說,最好將內部資源從外部注入。


使用依賴項注入的類別得益於 final 關鍵字,可以保證不變性,並且支持多個資源實例。此外,依賴項注入不僅可以在構造函數中使用,還可以在靜態工廠和構建器中使用。


依賴項注入不僅可以簡單地傳遞資源本身,而且通常也使用傳遞資源工廠的方式。工廠是指在調用時重複創建特定類型實例的對象。這種方法稱為工廠方法模式,Java 8 中的 Supplier 是表示工廠的完美範例。


public static List create(Supplier generator) {
    ...


通常使用受限通配符類型來限制工廠的類型參數。使用這種方法,客戶端可以傳遞任何與其指定類型兼容的子類型作為工廠。


依賴項注入雖然可以提高靈活性並簡化測試,但在依賴關係過多的項目中,成本可能會非常高。在這種情況下,可以使用依賴項注入框架(如 Dagger、Guice、Spring 等)來降低成本。


來源

제이온
제이온
제이온
제이온
[有效 Java] 項目 4. 要阻止實例化,請使用私有建構函數 僅包含靜態方法和欄位的工具類,最好將建構函數的存取修飾符設定為 private,以阻止實例化。 這可以防止使用者誤認為建構函數是自動生成的,並使繼承變得不可能,從而明確表示類別的意圖。

2024年4月28日

[Effective Java] 項目 6. 避免不必要的物件建立 這是一份關於在 Java 中減少不必要物件建立的指南。對於 String、Boolean 等不變物件,最好使用字面值;對於正規表示式,最好快取 Pattern 物件。此外,自動裝箱會導致效能下降,因此最好使用基本類型。有關更多資訊,請參閱「Effective Java」。

2024年4月28日

[有效 Java] 項目 3. 使用私有建構函式或枚舉類型來保證單例 本文章介紹了在 Java 中實現單例模式的三種方法(公用靜態成員、靜態工廠方法、枚舉類型),並說明了每種方法的優缺點以及序列化時的注意事項。考慮到反射攻擊的安全性以及程式碼簡潔性,文章建議使用枚舉類型作為最合適的方法。(資料來源:有效 Java, https://catsbi.oopy.io/d7f3a636-b613-453b-91c7-655d71fda2b1)

2024年4月27日

邏輯數據模型 邏輯數據模型是將概念數據模型轉換為關係數據庫範式的過程,根據映射規則,將 1:1、1:N、N:M 關係 轉換為關係數據庫中的表格,並通過正規化來確保數據完整性。通過 1NF、2NF、3NF 的正規化過程,對表格進行 優化,消除部分依賴和傳遞依賴。
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2024年4月9日

概念性數據模型 概念性數據模型是將實體分離並使用 ERD 表示實體間關係的過程。實體是獨立的資訊單位,屬性是 實體擁有的數據。識別碼用於唯一識別實體,關係表示實體間的交互作用。基數性表示實體間的數量關係,可選性表示數據的必需性。
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2024年4月8日

[非计算机专业,如何成为一名开发者] 14. 新手开发者常问的技术面试内容总结 本指南旨在为新手开发者提供技术面试准备指导。涵盖了面试中常见的概念,例如主内存区域、数据结构、关系型数据库 (RDBMS) 和 NoSQL、过程式编程和面向对象编程、重写和重载、页面替换算法、进程和线程、OSI 七层模型、TCP 和 UDP 等。
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

2024年4月3日

單人開發應用程式需要進行哪些測試? 本文將探討如何為應用程式開發設定測試優先順序並制定有效的測試策略。作者建議將人機測試、整合測試、單元測試和驗收/小工具測試依序排列優先順序,並強調時間效率。本文將介紹適合單人開發環境的實用測試策略。
Alien Story
Alien Story
Alien Story
Alien Story
Alien Story

2024年5月16日

Rust 如何防止并发错误 Rust 是一种强大的语言,可以解决并发编程的难题。 由于其类型系统和所有权模型,线程之间的数据传递和共享是安全的。 通过内部可变性模式,例如 Mutex、Channel 和 Atomic,可以定义共享变量并安全地使用它们。 Rust 积极解决并发问题,使其广泛应用于大型系统开发。
곽경직
곽경직
곽경직
곽경직
곽경직

2024年3月28日

[SI 開發者故事] 09. SI 專案投入後正式開始開發 SI 開發者在專案投入後會開發 RFP 中規定的功能,但由於客戶的額外需求,導致程式碼變更頻繁,效率不再重要,快速開發才是關鍵。 因此,開發應以功能實現為重點,而非乾淨程式碼或效率。
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

2024年4月18日