Кинжал 2 - Что лучше, внедрить конструктор или предоставить метод? - PullRequest
0 голосов
/ 27 августа 2018

Я изучаю Dagger 2 с Android. В большинстве постов, которые я прочитал, написано, что предпочтительнее использовать конструктор, а не метод полей и методов.

Я запутался и хотел уточнить, когда я должен использовать инъекцию в конструктор, а когда инъекцию поля и метода?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Инъекция с помощью конструктора более читабельна, и вы можете легко отличить часть класса, которая связана с внедрением зависимости от остальных. Во-вторых, все значения инициализируются с самого начала существования класса, поэтому вы можете использовать их, например, в блоках инициализации.

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

Но все это не означает, что не существует вариантов использования для внедрения поля или метода. Инъекция поля особенно полезна в классах Android, для которых вы не можете управлять такими экземплярами, как Activity.

Я склонен использовать инъекцию поля также в суперклассах, для которых дети используют инъекцию конструктора, и я не хочу загрязнять конструкторов общими объектами. Например. У меня есть BaseViewModel, в котором я внедряю ExceptionHandler в поле, таким образом мне не нужно помещать этот ExceptionHandler в каждый дочерний конструктор класса, а затем передавать вверх в базу.

0 голосов
/ 27 августа 2018

Я думаю, что эмпирическое правило заключается в том, чтобы использовать вставку полей только для классов платформы, которые создаются системой, а не разработчиком: Activity Fragment и т. Д. (Потому что вы не можете, скажем, создавать экземпляр Activity самостоятельно) ,

Используйте инжекцию конструктора для всего остального, одно из преимуществ, почему инжекция конструктора предпочтительнее, заключается в том, что с ним гораздо проще работать для модульного тестирования - вы все равно можете создать экземпляр класса "вручную" с помощью этого конструктора.

По крайней мере, для меня инъекция в конструктор кажется более «естественной» / более объектно-ориентированной - зависимости передаются в конструктор, и дело за ними, чтобы решать, как ему нужно, инъекция поля, как будто кто-то извне приходит и «пихает» «эти зависимости в введенном классе

...