Лучшие практики Kotlin: объявляйте переменные экземпляра / init - PullRequest
0 голосов
/ 02 октября 2018

Допустим, у меня есть следующие классы:

class Activity1: Activity {
private var objects = arrayListOf<MyObject>()

  override fun onCreate(...) {
    ...
    Thread {
        getThoseObjects() {
            this.runOnUiThread {
                objects = it
                //load a fragment using objects
                val fragment = MyFragment.newInstance(objects)
            }
        }

    }.start()
  }

  fun startActivity2() {
    val i = Activity2.newIntent(objects)
    ...
  }
}

class Activity2: Activity {
  private lateinit var objects: ArrayList<MyObject>

  override onCreate(...) {
      objects = intent.getSerializableExtra(MY_KEY) as ArrayList<MyObject>
  }
}

Является ли это общепринятой наилучшей практикой для объявления / инициализации массива объектов в обоих этих классах?

В Деятельности 1 Iнужно взять его с сервера и использовать во фрагменте, а также при необходимости передать в Activity2.Я не хочу делать его обнуляемым, но также кажется странным инициировать пустой массив.

В Activity2 переменная lateinit (из того, что я обнаружил) кажется лучшим способом справиться с этим.

Что касается неконтролируемого приведения из приведения getSerializableExtra, я уверен, что могу игнорировать предупреждение, но я бы хотел, чтобы у кого-то был хитрый прием, чтобы его избежать.

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Вы можете использовать свойство делегата lazy для вашей инициализации.

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

Так что для Activity1 это будет выглядеть так:

private val objects by lazy { return@lazy arrayListOf<MyObject>()}

для Activity2:

private val objects: ArrayList<MyObject>? by lazy { return@lazy (intent?.getSerializableExtra(MY_KEY) as ArrayList<MyObject>) ?: null }

Больше от здесь .

0 голосов
/ 02 октября 2018

Создайте некоторый общий класс / объект, такой как презентатор, с состоянием, моделью представления или другой абстракцией в зависимости от вашей архитектуры.Он должен отвечать за сетевой вызов и сохранение значения в поле.Сделайте запрос на загрузку данных в первом действии.Затем запустите второе действие и попробуйте получить доступ к полю, в котором хранится значение (или нет).Если оно не равно NULL, покажите ваши данные, если оно не ожидает его завершения, а затем оповестите о своей активности, используя какой-либо шаблон наблюдателя или другой материал.Это более чистый способ.

0 голосов
/ 02 октября 2018

Вы также можете использовать lateinit var в Activity1 для объектов.

Когда вы отправляете объекты в Activity2, пусть Activity2 обрабатывает нулевые значения из намерения в методе onCreate

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