Инициализация клиента Retrofit в приложении - PullRequest
0 голосов
/ 31 августа 2018

Как показано ниже?

val retro: Retro by lazy {
    PilotApp.retro!!
}

class PilotApp : Application() {

   companion object {
      var retro: Retro? = null
   }

   override fun onCreate() {
      retro = Retro(applicationContext)
      super.onCreate()
   }
}

Это хороший способ инициализации? Заранее спасибо.

1 Ответ

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

Это не соответствует правилу «инверсии контроля» и не является хорошей идеей.

Причина, по которой это не очень хорошая идея, заключается в том, что всякий раз, когда класс (например, ViewModel, Fragment или Activity или ...) хочет использовать retro, он должен сам получить объект Retro, вызвав вашу первую строку (PilotApp.retro).

Альтернатива (называемая Dependency Injection / Inversion of Dependency) состоит в том, что объект Retro передается классу (опять же, ViewModel или что-то еще), когда он инициализируется.

Причина, по которой это важно, заключается в том, что при втором подходе вы можете сделать свои классы, использующие Ретро, ​​тестируемыми. Вы можете дать им RetroMock или TestRetro, которые делают то, что вы хотите (например, макет API для возврата ошибки).

Еще одно замечание для вашего примера: вам не нужно делать ретро-обнуляемым, вы должны сделать вашу переменную a lateinit и сделать ее ненулевой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...