---
title: Дополнительные концепции
seo:
  title: Дополнительные концепции — Java Developer
  description: Тема «Дополнительные концепции» для собеседования Java Developer. Что такое «антипаттерн»? Какие антипаттерны вы знаете? Что такое Dependency Injection?
---

[Все темы Java Developer](/java-developer)

## <strong>Что такое «антипаттерн»? Какие антипаттерны вы знаете?</strong> [#q-14bee738d69b811ea96fd894bb273a06]

<strong>Антипаттерн</strong> — это распространенное решение, которое на практике
оказалось неэффективным или проблематичным. Это плохая практика, которая может
привести к трудностям в сопровождении и развитии программного обеспечения.

Некоторые известные антипаттерны&#58;

1. <strong>Big Ball of Mud</strong>&#58; Отсутствие четкой архитектуры, система
   становится запутанной и сложной для понимания и сопровождения.

1. <strong>Spaghetti Code</strong>&#58; Неподдерживаемый и запутанный код, где
   логика перемешана и нет ясной структуры.

1. <strong>God Object (God Class)</strong>&#58; Один класс выполняет слишком
   много обязанностей, что нарушает принцип единственной ответственности (SRP).

1. <strong>Lava Flow</strong>&#58; Система содержит много мертвого или
   устаревшего кода, который сложно удалить из-за его неизвестного влияния.

1. <strong>Golden Hammer</strong>&#58; Использование одной технологии или
   подхода для всех проблем, вне зависимости от их специфики.

1. <strong>Copy-Paste Programming</strong>&#58; Дублирование кода вместо его
   повторного использования через функции или классы, что усложняет
   сопровождение.

1. <strong>Reinventing the Wheel</strong>&#58; Создание собственных реализаций
   функциональности, которая уже доступна в виде стандартных библиотек или
   инструментов.

1. <strong>Magic Numbers</strong>&#58; Использование необъяснимых числовых
   констант в коде вместо описательных переменных или констант.

1. <strong>Premature Optimization</strong>&#58; Оптимизация кода до того, как
   возникла необходимость, что усложняет разработку и сопровождение.

1. <strong>Cargo Cult Programming</strong>&#58; Использование паттернов или
   подходов без полного понимания их сути и необходимости.

:::note[Ссылки для изучения]

1. [Паттерны проектирования в Java](https://javarush.com/groups/posts/2267-patternih-proektirovanija-v-java)
   :::

---

## <strong>Что такое</strong> <code>Dependency Injection</code><strong>?</strong> [#q-14bee738d69b81a78c72fd1922920caa]

<code>Dependency Injection</code> <strong>(Внедрение зависимостей)</strong> —
это паттерн проектирования, который позволяет объектам получать свои зависимости
от внешних источников вместо создания их самостоятельно. Этот паттерн
способствует слабой связности и повышает тестируемость и гибкость кода.

Основные способы внедрения зависимостей&#58;

1. <strong>Constructor Injection</strong>&#58; Зависимости передаются через
   конструктор объекта.

   ```java
   public class Service {
       private final Repository repository;

       public Service(Repository repository) {
           this.repository = repository;
       }

       // методы класса
   }
   ```

1. <strong>Setter Injection</strong>&#58; Зависимости передаются через сеттеры
   (методы установки).

   ```java
   public class Service {
       private Repository repository;

       public void setRepository(Repository repository) {
           this.repository = repository;
       }

       // методы класса
   }
   ```

1. <strong>Field Injection</strong>&#58; Зависимости внедряются напрямую в поля
   класса (обычно используется с фреймворками, поддерживающими DI, например,
   Spring).

   ```java
   public class Service {
       @Inject
       private Repository repository;

       // методы класса
   }
   ```

Внедрение зависимостей способствует разделению ответственности и улучшает управление зависимостями между объектами, облегчая тестирование и поддержку кода.

:::note[Ссылки для изучения]

1. [Паттерны проектирования в Java](https://javarush.com/groups/posts/2267-patternih-proektirovanija-v-java)
   :::
