Основная проблема в Java состоит в том, что когда вы в классе A делаете new B()
, это означает, что класс A очень тесно связан с классом B на уровне байтового кода.
Как правило, это хорошая вещьпоскольку это означает, что получающееся в результате приложение становится очень устойчивым, так как все «кирпичики» очень хорошо «склеены».
Однако вам часто приходится откладывать некоторые проблемы проектирования для развертывания времени (а иногда даже времени выполнения)и способ обработки этого в Java традиционно состоял в том, чтобы делегировать Фабрику, которая, возможно, даже в свою очередь делегирует другую Фабрику и т. д., пока вы не достигнете места, где вы принимаете решение.Обычно это делается с помощью файла свойств, содержащего либо флаги, соответствующие if
-словиям в коде (что требует от программиста предвидеть все ситуации при написании кода), либо имена классов, которые необходимо разрешить с помощью Class.forName()
(что является хрупким каккомпилятор не может помочь).
Преимущество Dependency Injection заключается в том, что вы обойдете жесткую привязку оператора new
, делегировав ответственность за создание соответствующего объекта вне вашего собственного кода (для контейнера, но это можета также быть божеством).Вы создаете несколько очень четких линий, в которых вы можете собрать все вместе, и для тех DI-платформ, обеспечивающих настройку кода (как Guice), результат может быть как устойчивым, так и модульным.
Обратите внимание, что кодирование интерфейсов делаетлегче определить правильные места для надрезов для линий разреза, поскольку использование интерфейса обычно соответствует точкам инъекции.