Я новичок в Guice.Является ли предпочтительным внедрение инжектора или инжекция поля?
Инжекция поля кажется быстрой и простой, но тестирование будет проблемой, так как конструктор отсутствует.
Спасибо.
На их Минимизировать изменяемую вики-страницу , команда Guice говорит:
Минимизировать изменчивость Везде, где возможно, используйте конструктор для создания неизменяемых объектов. Неизменяемые объекты просты, доступны для совместного использования и могут быть составлены.Следуйте этой схеме, чтобы определить ваши типы инъекций: [...] Методы и поля инъекций Внедрение в конструктор имеет некоторые ограничения: Внедренные конструкторы могут быть необязательными. Его нельзя использовать, если объекты не созданы Guice.Для определенных структур это является нарушителем. Подклассы должны вызывать super() со всеми зависимостями.Это делает внедрение конструктора громоздким, особенно когда изменяется внедренный базовый класс. Внедрение метода наиболее полезно, когда вам нужно инициализировать экземпляр, который не создан Guice.Расширения, такие как AssistedInject и Multibinder, используют инъекцию метода для инициализации связанных объектов. Внедрение поля имеет наиболее компактный синтаксис, поэтому он часто отображается на слайдах и в примерах.Он не инкапсулирован и не тестируем.Никогда не вводите последние поля;JVM не гарантирует, что введенное значение будет видно всем потокам.
Везде, где возможно, используйте конструктор для создания неизменяемых объектов. Неизменяемые объекты просты, доступны для совместного использования и могут быть составлены.Следуйте этой схеме, чтобы определить ваши типы инъекций:
[...]
Внедрение в конструктор имеет некоторые ограничения:
super()
Внедрение метода наиболее полезно, когда вам нужно инициализировать экземпляр, который не создан Guice.Расширения, такие как AssistedInject и Multibinder, используют инъекцию метода для инициализации связанных объектов.
Внедрение поля имеет наиболее компактный синтаксис, поэтому он часто отображается на слайдах и в примерах.Он не инкапсулирован и не тестируем.Никогда не вводите последние поля;JVM не гарантирует, что введенное значение будет видно всем потокам.
Хотелось бы указать на некоторые различия, чтобы вы могли решить для себя:
final
Выше всего несколько моментов для размышления.Я лично предпочитаю Constructor Injection из-за простоты тестирования и поддержки final.