#java #design-patterns #guice
#java #шаблоны проектирования #guice
Вопрос:
В моем приложении у меня есть Service Manager, который обрабатывает все мои запросы. Теперь этот диспетчер служб использует внешние службы для выполнения некоторых запросов определенного типа.
Например, рассмотрим приведенный ниже пример кода:
Class ServiceManager{
private final A a;
private final B b;
private ExternalService externalService;
@Inject
public ServiceManager(A a, B b)
{
this.a =a;
this.b =b;
}
public void processIncomingRequestUsingExternalService(){...}
}
Теперь для того, чтобы инициализировать ExternalService, какой подход лучше использовать с помощью GUICE
- Используйте внедрение setter, так как в будущем может появиться «n» количество внешних служб разного типа, которые может захотеть использовать этот менеджер служб.
- Или используйте внедрение конструктора, как я использовал для объектов классов A и B, которые являются внутренним классом моего приложения.
Примечание: — Здесь ExternalService является вспомогательным средством для внешней службы.
Комментарии:
1. Внедрение конструктора > все (например olivergierke.de/2013/11/why-field-injection-is-evil ). Также всемогущие классы manger плохи. Принцип единой ответственности по-прежнему применяется, поэтому большой n = обычно плохой дизайн.
2. @zapl Моя точка зрения с большим n была, скажем, 2-3 внешними службами, которые, возможно, придется использовать моему менеджеру. Будет ли хорошо добавить все эти внешние сервисные помощники в конструктор.
Ответ №1:
Внедрение конструктора имеет следующие преимущества перед внедрением установщика:
- Явно объявляйте зависимости тому, кто читает код.
- Модульное тестирование становится более чистым.
- Зависимости могут быть помечены как ‘окончательные’, тем самым увеличивая неизменяемость.
Хорошая документация, в которой более подробно обсуждаются различия: https://www.petrikainulainen.net/software-development/design/why-i-changed-my-mind-about-field-injection/