Улучшает качество вашего кода за счет уменьшения связи между классами.
Если класс создает экземпляр другого класса, то существует прямая зависимость между двумя классами (= тесная связь). Так, например, если класс A имеет связь с интерфейсом B, если класс A обрабатывает создание экземпляров интерфейса B, то класс A должен указывать конкретную реализацию для создания экземпляров, и эти классы становятся тесно связанными.
Допустим, у нас есть следующий интерфейс:
interface B{}
, а затем следующий класс
class A{
private B b = new BImpl();
...
}
В приведенном выше примере (без DI) класс A имеет явную зависимость от BImpl, что означает, что если вы когда-нибудь захотите использовать другую реализацию B, вам также придется изменить класс A.
DI (и слабая связь в целом) нацелены на удаление такого рода зависимостей и имеют кодовую базу, где изменения в одной части кода не «колеблются» во всем приложении, требуя большого количества изменений. Приведенный выше пример довольно тривиален, но если у вас есть кодовая база среднего и большого размера с жесткой связью, эта проблема может быть довольно серьезной.