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.

제이온

[Эффективный 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

  • Если класс внутренне зависит от одного или нескольких ресурсов, не рекомендуется использовать статические утилитарные классы и классы-синглтоны, вместо этого рекомендуется использовать инъекцию зависимостей.
  • Использование инъекции зависимостей позволяет улучшить гибкость, повторное использование и тестируемость класса, а ресурсы можно ввести в конструктор, статический фабричный метод, строитель и т. д.
  • Инъекция зависимостей может использоваться путем передачи самих ресурсов или ресурсов фабрики, а для проектов с большим количеством зависимостей эффективным решением является использование фреймворка зависимостей.

Если класс внутренне зависит от одного или нескольких ресурсов, и эти ресурсы влияют на работу класса, следует избегать использования синглтонов и статических утилитарных классов.


Класс не должен создавать эти ресурсы самостоятельно, а вместо этого лучше передавать необходимые ресурсы в конструктор. Инъекция зависимостей позволяет улучшить гибкость, возможность повторного использования и удобство тестирования класса.


Пример

Пример использования статического утилитарного класса

public class SpellChecker {

    private static final Lexicon dictionary = new Lexicon();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // Логика с использованием dictionary
    }

    public static List suggestions(String typo) {
        // Логика с использованием dictionary
    }

Предполагается, что этот утилитарный класс использует только один словарь. Однако в реальности словари могут быть разными для каждого языка, и даже могут быть отдельные словари для специальной лексики.


Пример использования класса-синглтона

public class SpellChecker {

    private final Lexicon dictionary = new Lexicon();

    public static SpellChecker INSTANCE = new SpellChecker();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // Логика с использованием dictionary
    }

    public static List suggestions(String typo) {
        // Логика с использованием dictionary
    }


Класс-синглтон также предполагает использование только одного словаря, поэтому возникает та же проблема, что и выше.


Решение 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) {
        // Логика с использованием dictionary
    }

    public static List suggestions(String typo) {
        // Логика с использованием dictionary
    }


Вы также можете удалить ключевое слово final для dictionary в статическом утилитарном классе или в классе-синглтоне и спроектировать его так, чтобы словарь можно было заменить на другой извне. Однако этот подход неудобен сам по себе и может привести к проблемам одновременности в многопоточной среде.


Решение 2 - Используйте инъекцию зависимостей.

public class SpellChecker {

    private final Lexicon dictionary;

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

    public static boolean isValid(String word) {
        // Логика с использованием dictionary
    }

    public static List suggestions(String typo) {
        // Логика с использованием dictionary
    }


Из приведенного выше примера видно, что статические классы и классы-синглтоны не должны зависеть от внутренних ресурсов. То есть, внутренние ресурсы должны поступать извне.


Класс, использующий инъекцию зависимостей, благодаря ключевому слову final гарантирует неизменяемость и поддерживает несколько экземпляров ресурсов. Кроме того, инъекция зависимостей может быть применена не только в конструкторе, но и в статических фабриках и строителях.


Инъекция зависимостей может быть реализована просто передачей самого ресурса, но часто используется также передача фабрики ресурсов. Фабрика - это объект, который при вызове повторно создает экземпляр определенного типа. Такой подход называется шаблоном фабричного метода, а Supplier в Java 8 является идеальным примером реализации фабрики.


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


Часто используется ограниченный подстановочный знак типа для ограничения типа параметра фабрики. Используя этот подход, клиент может передать любую фабрику, которая является подтипом объявленного типа.


Инъекция зависимостей улучшает гибкость и удобство тестирования, но в проектах с большим количеством зависимостей может быть достаточно дорогой. В таких случаях вы можете использовать фреймворки инъекции зависимостей (Dagger, Guice, Spring и т. д.) для сокращения затрат.


Источник

제이온
제이온
제이온
제이온
[Эффективный Java] Элемент 3. Гарантируйте единственность с помощью частного конструктора или перечисления В этой статье рассматриваются три способа реализации паттерна Singleton в Java (public static-член, статический фабричный метод, перечисление), а также преимущества и недостатки каждого из них, а также важные моменты при сериализации. В качестве наиболее

27 апреля 2024 г.

[Эффективная Java] Элемент 6. Избегайте ненужного создания объектов Руководство по минимизации ненужного создания объектов в Java. Для неизменяемых объектов, таких как String, Boolean, рекомендуется использовать литералы, а для регулярных выражений – кэшировать экземпляры Pattern. Кроме того, автоупаковка может привести к

28 апреля 2024 г.

[Эффективный Java] Элемент 4. Используйте частный конструктор, чтобы предотвратить создание экземпляра Для утилитарных классов, которые содержат только статические методы и поля, рекомендуется сделать конструктор частным, чтобы предотвратить создание экземпляра. Это предотвращает случайное создание экземпляра пользователем и делает наследование невозможным

28 апреля 2024 г.

Как Rust предотвращает ошибки в многопоточности Rust — это мощный язык, который решает проблемы с многопоточной программированием. Благодаря системе типов и модели владения, передача и общий доступ к данным между потоками безопасны. С помощью таких паттернов внутренней изменчивости, как Mutex, Channel
곽경직
곽경직
곽경직
곽경직
곽경직

28 марта 2024 г.

Концептуальное моделирование данных Концептуальное моделирование данных - это процесс разделения сущностей и представления отношений между ними в виде ERD. Сущность - это независимая единица информации, а атрибут - это данные, которыми обладает сущность. Идентификатор однозначно идентифицир
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

8 апреля 2024 г.

[Javascript] Структура объекта (V8) Объект JavaScript в движке V8 оптимизирован как структура данных в зависимости от состояния. Он может быть переключен в быстрый режим, как структура, или в режим словаря, как хэш-таблица. Быстрый режим быстрый, так как ключ и значение почти неизменны. Од
곽경직
곽경직
곽경직
곽경직
곽경직

18 марта 2024 г.

[Для неспециалистов, выживание как разработчик] 14. Краткое изложение часто задаваемых вопросов на техническом собеседовании для начинающих разработчиков Руководство по подготовке к техническому собеседованию для начинающих разработчиков. Объясняются концепции, которые часто встречаются на собеседованиях, такие как область основной памяти, структуры данных, RDBMS и NoSQL, процедурное и объектно-ориентирова
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 апреля 2024 г.

Логическое моделирование данных Логическое моделирование данных - это процесс преобразования концептуальной модели данных в соответствии с парадигмой реляционных баз данных, включая обработку отношений 1:1, 1:N, N:M и обеспечение целостности данных с помощью нормализации. Процесс включа
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

9 апреля 2024 г.

[История разработчика SI] 12. Технологический стек, часто используемый в проектах SI Разработчики SI в Южной Корее в основном используют технологический стек на основе Java: Spring, Oracle DB, Mybatis, JSP, JavaScript, HTML, CSS, чтобы разрабатывать эффективные и стабильные ИТ-системы. В качестве среды разработки они используют Eclipse. Э
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

19 апреля 2024 г.