Использование массива null вместо необязательного - PullRequest
1 голос
/ 07 октября 2019

Мне было интересно, почему массив нулей размера 1 вместо необязательного:

https://github.com/android/architecture-components-samples/blob/master/GithubBrowserSample/app/src/test-common/java/com/android/example/github/util/LiveDataTestUtil.kt#L27

Оригинальный код:

    @Throws(InterruptedException::class)
    fun <T> getValue(liveData: LiveData<T>): T {
        val data = arrayOfNulls<Any>(1)
        val latch = CountDownLatch(1)
        val observer = object : Observer<T> {
            override fun onChanged(o: T?) {
                data[0] = o
                latch.countDown()
                liveData.removeObserver(this)
            }
        }
        liveData.observeForever(observer)
        latch.await(2, TimeUnit.SECONDS)

        return data[0] as T
    }

почему не используется:

 @Throws(InterruptedException::class)
    fun <T> getValue(liveData: LiveData<T>): T {
        var data: T? = null
        val latch = CountDownLatch(1)
        val observer = object : Observer<T> {
            override fun onChanged(o: T?) {
                data = o
                latch.countDown()
                liveData.removeObserver(this)
            }
        }
        liveData.observeForever(observer)
        latch.await(2, TimeUnit.SECONDS)

        return data!!
    }

Лучше ли использовать массив, чем необязательный объект? Почему? Или это точно так же?

Спасибо

1 Ответ

3 голосов
/ 07 октября 2019

Глядя на проект history , этот файл раньше был Java, но был переведен непосредственно на Kotlin - оригинальная версия Java здесь здесь , и вы можете видеть, что они просто преобразовали егопрямо в Котлин.

Хотя версия, которую вы дали, имеет больше смысла в Kotlin, в Java такой возможности нет, потому что локальные переменные, которые вы используете в анонимном классе или лямбде, должны быть окончательными. Вот почему вместо этого используется массив из одного элемента. Но если бы они написали это изначально на Kotlin (или если бы они должны были сделать рефакторинг), они почти наверняка сделали бы это так, как вы.

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