Инжект полей без конструктора c Dagger 2

89
08 июля 2021, 03:50

На сайте с документации к Dagger 2 есть следующий пример кода и слова:

class CoffeeMaker {
  @Inject Heater heater;
  @Inject Pump pump;
  ...
}

If your class has @Inject-annotated fields but no @Inject-annotated constructor, Dagger will inject those fields if requested, but will not create new instances. Add a no-argument constructor with the @Inject annotation to indicate that Dagger may create instances as well.

Что это значит? Т.е., если конструктора с @Inject не будет, как Dagger будет инжектить эти поля "if requested, but will not create new instances"?

Т.е. насколько я понимаю, тут:

class CoffeeMaker @Inject (Heater heater) {
}

если объект Heater раньше не был создан - dagger создаст новый его объект (условно говоря, heater = Heater()), если же его объект сейчас используется другим классом, то получим тут ссылку на этот же обьект, что использует другой класс (условно говоря, heater = heaterObj). А что будет тут?

class CoffeeMaker {
   @Inject Heater heater;
}

В случае, если объект Heater раньше не был создан? И в случае, если такой его обьект сейчас используется другим классом?

Answer 1

В этом случае нужно явно инжектить. Пример инжекта полей в Fragment() на андроид:

class AlbumsFragment: Fragment() {
    @Inject
    lateinit var mAdapter: AlbumsListAdapter
    @Inject
    lateinit var factory: CustomViewModelFactory
    lateinit var viewModel: AlbumViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(false)
        (activity?.application as App).getComponent().inject(this)
        viewModel = ViewModelProviders.of(this, factory).get(AlbumViewModel::class.java)
        viewModel.setAdapter(mAdapter)
        mAdapter.setActivity(activity as AppCompatActivity)
    }
}

Интерфейс Component:

@Component(modules = [AppModule::class])
interface ApplicationComponent {
    fun inject(fragment: AlbumsFragment)
}

Что это значит? Т.е., если конструктора с @Inject не будет, как Dagger будет инжектить эти поля "if requested, but will not create new instances"?

Инициализация полей происходит после метода:

(activity?.application as App).getComponent().inject(this)

Т.е. если не будет этого вызова, поля не будут проинициализированы.

В случае, если объект Heater раньше не был создан? И в случае, если такой его обьект сейчас используется другим классом?

Если в Module() поля не обозначены как синглтоны, то будут созданы новые объекты, а если обозначены, то будет инжектится один экземпляр для всех классов.

READ ALSO
вопрос про массивов

вопрос про массивов

В одном тесте я встретил пункты

83
Как готовиться к собеседованию на позицию java middle? [закрыт]

Как готовиться к собеседованию на позицию java middle? [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах

115
Как работать с римскими числами на java

Как работать с римскими числами на java

Всем привет! Есть задание: написать калькулятор

133