Кинжал по умолчанию

Я пытаюсь получить Dagger работу над моим проектом.

Однако во время компиляции я получаю следующее исключение в одном из моих классов:

Ошибка: на Foo нет инъекционных элементов. Вы хотите добавить конструктор для инъекций?

Однако класс не имеет зависимостей и как таковой использует конструктор no-arg по умолчанию:

public class Foo
{
    ...
}

Нужно ли мне добавлять инъецируемый конструктор no-arg, как показано ниже?

public class Foo
{
     @Inject
     public Foo()
     {
     }

     ....
}

Ответы

Ответ 1

Кинжал активно требует, чтобы вы добавили @Inject в ваш класс для инъекций, добавив конструктор no-args или добавив инъекционное поле. Третий вариант - вернуть класс из метода @Provides следующим образом:

@Module(...)
class MyModule {
  @Provides Foo provideFoo() {
    return new Foo(); // Foo is not injectable.
  }
}

Это похоже на дополнительный шаблон, но из опыта работы с Guice и другими структурами привязка JIT случайных классов оказывается изобилующей ошибкой. Мы увидели, что java.lang.String вводится в вещи, и, поскольку кто-то забыл связать его, вы попали в "" вместо нужной строки. Поэтому для кинжала требуется конструктор @Inject или поле. (Возможно, у Guice это значение в 4.x, хотя для обратной совместимости оно по умолчанию отключено)

Это один редкий случай, когда Кинжал выбрал больше гарантий правильности за счет небольшого количества многословности.