Guice Конструктор впрыска или полевой впрыск? - PullRequest
0 голосов
/ 27 сентября 2018

Я новичок в Guice.Является ли предпочтительным внедрение инжектора или инжекция поля?

Инжекция поля кажется быстрой и простой, но тестирование будет проблемой, так как конструктор отсутствует.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Использовать инъекцию в конструктор

На их Минимизировать изменяемую вики-страницу , команда Guice говорит:

Минимизировать изменчивость

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

[...]

Методы и поля инъекций

Внедрение в конструктор имеет некоторые ограничения:

  • Внедренные конструкторы могут быть необязательными.
  • Его нельзя использовать, если объекты не созданы Guice.Для определенных структур это является нарушителем.
  • Подклассы должны вызывать super() со всеми зависимостями.Это делает внедрение конструктора громоздким, особенно когда изменяется внедренный базовый класс.

Внедрение метода наиболее полезно, когда вам нужно инициализировать экземпляр, который не создан Guice.Расширения, такие как AssistedInject и Multibinder, используют инъекцию метода для инициализации связанных объектов.

Внедрение поля имеет наиболее компактный синтаксис, поэтому он часто отображается на слайдах и в примерах.Он не инкапсулирован и не тестируем.Никогда не вводите последние поля;JVM не гарантирует, что введенное значение будет видно всем потокам.

0 голосов
/ 27 сентября 2018

Хотелось бы указать на некоторые различия, чтобы вы могли решить для себя:

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

Выше всего несколько моментов для размышления.Я лично предпочитаю Constructor Injection из-за простоты тестирования и поддержки final.

...