Подтвердить что ты не робот

Java-зависимость: Кинжал 1 против Кинжала 2, что лучше?

В чем преимущества Dagger 2 над Кинжал 1?

До сих пор я нашел (просто) 2:

  • Dagger 2 позволяет использовать обфускацию кода с помощью proguard
  • Dagger 2 работает быстрее (что не очень полезно при использовании приложения для Android, но это важно, если вы используете его для какого-то сервера).

В то же время я обнаружил один большой недостаток: у вас не может быть переопределения модулей (@Module(overrides = true)) в Dagger 2, что в значительной степени раздражает, по крайней мере, для меня - это было очень полезно для unit test.

Существуют ли другие преимущества/недостатки?

4b9b3361

Ответ 1

Некоторые преимущества и недостатки, взятые из https://blog.gouline.net/2015/05/04/dagger-2-even-sharper-less-square/ и http://google.github.io/dagger/dagger-1-migration.html:

Преимущества кинжала 2:

  • Больше не отражается - все делается как конкретные вызовы (ProGuard работает без конфигурации вообще)
  • Отсутствует больше графика графика выполнения - повышает производительность, включая случаи для каждого запроса.
  • Прослеживаемый - лучший сгенерированный код и отсутствие отражения помогают сделать код читаемым и легко следовать
  • Поддерживает инъекцию метода в дополнение к инъекции поля и конструктора, которые были единственными двумя типами, поддерживаемыми кинжалом 1
  • Модули требуют меньше конфигурации, чем Dagger 1
  • Позволяет пользователям использовать любую хорошо сформированную аннотацию области. Кинжал 1 поддерживает только одну область: @Singleton.

И недостатки:

  • Теперь метод inject() имеет сильную ассоциацию типов с целью инъекции. Это хорошо для отладки, но это усложняет обычную практику инъекции из базовых классов (например, базовые действия, фрагменты и т.д.).
  • Для реализации компонента требуется перестроение проекта, и любые ошибки компиляции, связанные с инъекциями, приводят к исчезновению класса (т.е. не генерируемого).
  • Не поддерживает overrides. Модули, которые переопределяют для простых подделок при тестировании, могут создать подкласс модуля для эмуляции этого поведения. Модули, которые используют переопределения и полагаются на инъекцию зависимостей, должны быть разложены так, чтобы вместо этого модули переопределялись как выбор между двумя модулями.

EDIT 2016/11/16: Это не техническое преимущество, но Кинжал 1 теперь не рекомендуется (по состоянию на 15 сентября 2016 года) и больше не будет активно развиваться. Они рекомендуют перейти на кинжал 2.

Ответ 2

Я бы не рекомендовал взглянуть на toothpick.

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